2

私はpython3、venv、およびc9.io PAASを使用してWebアプリを作成しています。私のコードの構造は次のとおりです。

batch_runner.py
logic/
    __init__.py
    parsers/
        __init__.py
        time_parser.py
        abstract_parser.py

ここでは をbatch_runnerインポートabstract_parserし、次に time_parser からインポートします。すべてがインストールされ、venv がアクティブ化された状態で実行されます。

具体的には、次のものbatch_runner.pyが含まれます。

from logic.parsers import abstract
from sys import argv

url = argv[1]
a = abstract(url)

logic/__init__.py空です。logic/parsers/__init__.py内容:

from abstract_parser import abstract
from time_parser import _timeInfo

に行って直接logic実行すると、すべてが期待どおりに機能します。python abstract_parser.pyただし、1レベル上に移動して実行するとpython batch_runner.py、インポートできますが、から呼び出されたものをabstract_parser見つけることができず、スローされますtime_parserabstract_parserImportError: No module named 'abstract'

4

2 に答える 2

3

これを変える:

from abstract_parser import abstract

from logic.parsers.abstract_parser import abstract
于 2016-09-02T01:56:32.793 に答える
2

モジュールに関するPython ドキュメントからのインポートについて読んでください。

この場合、考えられる解決策の 1 つは、パッケージ内で相対インポートを使用することです。

つまり、 ではlogic/parsers/__init__.py、次を使用します。

from .abstract_parser import abstract
from .time_parser import _timeInfo

とでabstract_parser.py

from .time_parser import _timeInfo

これにより、モジュールとモジュールparsers/__init__.pyが見つかります。abstract_parsertime_parser

Python インポート システムには、陥る可能性がある驚くべき数のトラップがあります。Nick Coghlan によるこのブログ投稿では、それらの多くについて説明しています。個人的には、パッケージの開発を計画している場合は必読だと考えています。

于 2016-09-02T02:27:10.697 に答える