4

Python が the_page または the_generator という名前のモジュールがないと報告するため、インポート ステートメントに問題があります。

task_a.py には が含まれimport generator.the_page as ThePageており、メイン スクリプトとして実行する場合は問題ありません。

the_generator.py にはimport tasks.task_aが含まれていますが、メイン スクリプトとして実行すると、python で次のエラーがスローされます。

Traceback (most recent call last):
  File "/generator/the_generator.py", line 7, in <module>
    import tasks.tasks_a
  File "/generator/tasks/tasks_a.py", line 3, in <module>
    import generator.the_page as ThePage
ImportError: No module named the_page

これが構造です。

generator/
    __init__.py
    the_generator.py
    the_page.py
    tasks/
        __init__.py
        task_a.py

多分あなたは私の問題を手伝ってくれるでしょう。助けてくれてありがとう!

4

1 に答える 1

10

パッケージの途中からスクリプトを実行することは、いくつかの理由から悪い考えです。最も明白なのは、実行している理由ですimport generator.the_generator:相対インポートは正常に機能します。しかし、スクリプトを実行しただけでは、パッケージはありません。Python が検索方法を知ることができる唯一の他の方法は、の親ディレクトリが onであったかどうかですが、そうではありません。generatorgenerator.the_pagegenerator/the_generator.pygenerator.the_generator__main__generatorgenerator.the_pagegeneratorsys.path

ご想像のとおり、適切な親ディレクトリをそこに配置するように変更することでこれを回避できますsys.pathが、これも悪い考えです。

このソリューションには他にも多くの問題があります。最も深刻なことに、同じモジュールが 2 回インポートされる可能性が非常に高くなります (Python には、明らかに無関係な 2 つの名前がたまたま同じモジュールを参照していることを知る方法がないため)。また、展開するのも難しく (スクリプトが/usr/local/binパッケージ内にあることに依存している場合、スクリプトをインストールすることはできません…)、パッケージが .zip や .egg などで不足している場合は機能しません。


これを解決するには、2 つの標準的な方法があります。

まず、スクリプトをスクリプトではなくモジュールとして実行します。の親ディレクトリからgeneratorpython -m generator.the_generator代わりにpython generator/the_generator.py.

generatorこれの主な利点は、テストの場合と同様に、どこかのサイトパッケージにある場合でも、通常のインストールされた展開でも同様に機能することです。

generatorまたは、その中にあるモジュールではなく、横にあるスクリプトを作成し、それを実行します。if __name__ == '__main__':これは、すべてのコードをthe_generator.py関数に移動してから、2 行のラッパーを記述するのと同じくらい簡単です。

import generator.the_generator
generator.the_generator.main()

繰り返しますが、これは通常のインストールされた展開でも同様に機能します。binさらに、スクリプトをディレクトリにインストールできることを意味し、pipまたはipython.

于 2013-08-28T19:14:09.533 に答える