3

プロジェクトから、scrapy と同じディレクトリにないパッケージをインポートしようとしています。プロジェクトのディレクトリ構造は次のとおりです。

Main
  __init__.py
  /XPaths
    __init.py
    XPaths.py
  /scrapper
    scrapy.cfg
    /scrapper
      __init.py
      settings.py
      items.py
      pipelines.py
      /spiders
        myspider.py

xpaths.py内からアクセスしようとしていますmyspider.py。これが私の試みです:

1)from Main.XPaths.XPaths import XPathsHandler

2)from XPaths.XPaths import XPathsHandler

3)from ..Xpaths.XPaths import XPathsHandler

これらはエラーで失敗しました:

ImportError: No module named .......

私の最後の試みは:

4)from ...Xpaths.XPaths import XPathsHandler

これもエラーで失敗しました:

ValueError: Attempted relative import beyond toplevel package

私は何を間違っていますか?XPathsは Scrapy から独立しているため、ファイル構造はそのままにしておく必要があります。

//編集

@alecxe コメントに続いてさらにデバッグを行った後、パスをmain内に追加して、 sys.pathxpath をインポートする前に出力してみました。奇妙なことに、scrapperscrapy を実行するとディレクトリがパスに追加されます。ここに私が追加したものがあります:

'C:\\Users\\LaptOmer\\Code\\Python\\PythonBackend\\Main'

そして、これが私が印刷したときに得られるものですsys.path:

'C:\\Users\\LaptOmer\\Code\\Python\\PythonBackend\\Main\\scrapper'

なぜスクレイピーはそれをパスに追加するのですか?

4

2 に答える 2

1

少し厄介な解決策であることは知っていますが、あなたと同じ問題を抱えていたときに見つけることができたのは1つだけです。プロジェクトからファイルを含める前に、システム パスを最上位のパッケージ レベルに手動で追加する必要があります。

sys.path.append(os.path.join(os.path.dirname(__file__), '../..'))
from XPaths.XPaths import XPathsHandler
...

私が理解していることから、スクラップは独自のパッケージを作成します。これが、他のディレクトリからファイルをインポートできない理由です。これもエラーを説明しています:

ValueError: Attempted relative import beyond toplevel package
于 2013-12-17T17:46:59.043 に答える