スタックオーバーフローについても同様の質問がたくさんあることを私は知っています。しかし、一般的な答えは私にはうまくいかないようです。
私はこのようなファイル構造を持っています
proj/
lib/
__init__.py
aa.py
bb.py
test/
__init__.py
aa_test.py
Test.pyにコードを含めるとわかりました
import lib.aa
または
from lib import aa
lib/
ディレクトリ内のモジュールを参照できます。しかし、それはうまくいきませんでした。
だから私はパスに追加しようとしました、そしてそれはそれを正しく追加します:
os.environ["PATH"] += ":%s" % os.path.abspath(os.path.join("..",""))
print os.environ["PATH"]
しかし、今でも上記のインポートステートメントを試してみると...エラーが発生し続けます
ImportError: No module named aa
または
ImportError: Importing from non-package <Something...>
私が見逃している明らかなものはありますか?
__init__.py
ファイルが正しく構成されているかどうかを確認したり、パッケージ階層を確認したりする方法はありますか?
_sys.path
_ を更新する必要があります。これは、現在の環境でのシステムのパスとは対照的に、pythonがモジュールを探す場所です。 _os.environ["PATH"]
_ はを参照しています。
例:
_import os, sys
sys.path.insert(0, os.path.abspath(".."))
import aa
_
これを行った後、次のようにaa
で関数を使用できます。aa.myfunc()
受け入れられた回答 for python:ディレクトリからモジュールをインポートする にいくつかの詳細情報があります
Libディレクトリはpythonモジュールの検索パスにある必要があります。これは、シェルで使用される検索パスと同じではありません。
これはおそらくあなたのために働くでしょう:
import sys, os
sys.path.append(os.path.abspath(".."))
ただし、libパッケージがすでにパス上にあるコンテキストからコードを実行する方がおそらく良いでしょう。 'proj'ディレクトリなどから。
私も同様の問題を抱えていました。ここに私のアドバイスがあります。
sys.path
を変更する代わりに、test.pyをproj
(つまりプロジェクトルート)ディレクトリから実行することをお勧めします。このようにして、プロジェクトディレクトリは自動的にsys.path
になり、lib
パッケージをインポートできるようになります。
そして、絶対インポートを使用します。
Lib.aaをインポートしようとしているコードはどこにありますか?/proj /は作業ディレクトリではなく、現在設定されているとおりにする必要があると思います。 PATHの代わりに、ディレクトリをPYTHONPATHに追加して、インポートの検索パスに表示されるようにします。 http://docs.python.org/tutorial/modules.html#the-module-search-path を参照してください
また、 http://as.ynchrono.us/2007/12/filesystem-structure-of-python-project_21.html をご覧ください。ディレクトリのレベルを追加することを強くお勧めします。 lib.aa
の代わりに、my_proj.lib.aa
と呼びます。
システムPATH変数はpython importステートメントでは使用されません。PYTHONPATHを使用しますが、検索パスをインポートするために新しいディレクトリを追加する最良の方法は、sys.pathを変更することです。
これで問題が解決しない場合は、sys.pathの値とos.getcwd()によって返される値を質問に追加してください。