1. ホーム
  2. python

[解決済み] モジュール読み込み時に sys.path.insert(0, path) と sys.path(append) を使用した場合の影響について

2022-03-04 04:34:07

質問

最近、PythonのImportErrorで、ローカルコンピュータで実行するとモジュールが見つかるのに、CIサーバーでは見つからないという問題がありました。私は、この問題を sys.path.append(path) をスクリプト内で sys.path.insert(0, path) ここで path は文字列モジュールの場所です。

これは私のモジュールであり、インストールされたパッケージではないので ( 関連質問 ) 、なぜパスの順序でこの問題が解決するのでしょうか?

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

pythonは、ディレクトリのチェックインを sys.path を見つけるまで、リスト内の .py ファイルを探している。

理想的には、あなたのように修正しない限り、カレントディレクトリまたはスクリプトのディレクトリがリストの最初の常に最初の要素になることです。以下から ドキュメンテーション -

プログラム起動時に初期化されるように、このリストの最初の項目である path[0] は、Python インタープリタを起動するために使用されたスクリプトを含むディレクトリです。スクリプトディレクトリが利用できない場合(例えばインタプリタが対話的に起動された場合や、スクリプトが標準入力から読まれた場合)、path[0] は空の文字列になり、これは Python に現在のディレクトリのモジュールを最初に検索するように指示します。スクリプトディレクトリは PYTHONPATH の結果として挿入されるエントリの前に挿入されることに注意してください。

つまり、ほとんどの場合 .py ファイルをインポートしようとしたモジュールと同じ名前で、カレントディレクトリ (スクリプトが実行されている場所) に置いてください。

また、注意点として ImportError の場合、インポートエラーによると ImportError: No module named main - を意味するものではありません。 main.py もし上書きされていたとしても、読み込むのに問題はありません。この上のモジュールが.NET Frameworkで上書きされたのです。 py または他のファイル。

私のディレクトリ構成は以下の通りです。

 - test
    - shared
         - __init__.py
         - phtest.py
  - testmain.py

現在 testmain.py を呼び出します。 from shared import phtest であれば、問題なく動作します。

では、shared.pyをインストールするとしましょう。 test ディレクトリを作成します。

 - test
    - shared
         - __init__.py
         - phtest.py
  - testmain.py 
  - shared.py

を実行しようとすると from shared import phtest から testmain.py というエラーが表示されます。

ImportError: cannot import name 'phtest'

上で見たように、問題を引き起こしているファイルは shared.py ではなく phtest.py .