1. ホーム
  2. python

[解決済み] Python が私のモジュールを見つけられませんでした

2022-03-02 18:54:46

質問

私はpythonのプロジェクト(私はvirtualenv内で実行する)を持っており、それは次の構造を持っています。

Project
├───.git
├───venv
└───src
    ├───__init__.py
    ├───mymodules
    │   ├───__init__.py
    │   ├───module1.py
    │   └───module2.py
    └───scripts
        ├───__init__.py
        └───script.py

script.py

import src.mymodules.module1
...


venvを有効にした状態で、Projectディレクトリから以下のコマンドで実行しています。

(venv)$ python src/scripts/script.py

スクリプトは実行されますが、次のようなエラーが表示されて終了します。

Traceback (most recent call last):
  File "src/scripts/script.py", line 1, in <module>
    import src.mymodules.module1
ImportError: No module named src.mymodules.module1

pythonシェルを起動し、そこからモジュールをインポートしようとしましたが、エラーは出ませんでした。私はsrc内のすべてのディレクトリに_init__.pyを持っています。pythonは作業ディレクトリをsrc/scriptsとみなしているのでしょうか?なぜそうなるのでしょうか、また、そうであるならどうすれば src を作業ディレクトリにできますか?

解決方法を教えてください。

基本的には script.py のサブモジュールの一部であることを知らないのです。 src という名前のモジュールがどこにあるのかも知りません。 src があるかもしれません。これはpython2でも3でも同じです。

ご存知のように、Pythonはモジュールの検索を sys.path . モジュールをインポートするためには、そのモジュールが sys.path または、実行中のスクリプトと同じディレクトリにあります。

というときは python src/scripts/script.py , sys.path には Project/src/scripts/ (なぜなら、そこに script.py が配置されている)、しかし Project . なぜなら Project がパスに入っていない場合、そのディレクトリにあるモジュール ( src ) をインポートすることができません。

これを解決するには

想定しているのは、あなたの script.py がエントリーポイントになり src モジュール(例えば、メインプログラムかもしれません)。もしそうであれば、それを修正するために script.py と同じレベルまで src :

Project
├───.git
├───venv
|───script.py       <--- script.py moves up here
└───src
    ├───__init__.py
    └───mymodules
        ├───__init__.py
        ├───module1.py
        └───module2.py

こちらです。 script.py の中にあるものを自由にインポートすることができます。 src には何もありませんが src をインポートすることができます。 script.py .

もしそうでなく、かつ script.py の一部です。 src を使用すると、パイソンの -m を実行するための引数です。 script.py の一部として src というように

$ python -m src.scripts.script

python にどのモジュールを実行しているかを伝えたからです ( src ) にあるため、パスに含まれることになります。だから script.py のサブモジュールであることを認識します。 src からインポートすることができるようになります。 src .

しかし、このような状況では注意が必要です。 src インポート src.scripts.script .


この2つの方法の代わりとして、以下のように sys.path で直接 script.py :

import sys
sys.path.insert(0, '/path/to/Project') # location of src 

これはうまくいくのですが、通常、私の好みではありません。これは script.py がどのようにレイアウトされているかを正確に把握する必要があり、また、他の Python プログラムが script.py .