web-dev-qa-db-ja.com

__init__。pyでも相対パスが機能しない

スタックオーバーフローについても同様の質問がたくさんあることを私は知っています。しかし、一般的な答えは私にはうまくいかないようです。

私はこのようなファイル構造を持っています

  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ファイルが正しく構成されているかどうかを確認したり、パッケージ階層を確認したりする方法はありますか?

15
samirahmed

_sys.path_ を更新する必要があります。これは、現在の環境でのシステムのパスとは対照的に、pythonがモジュールを探す場所です。 _os.environ["PATH"]_ はを参照しています。

例:

_import os, sys
sys.path.insert(0, os.path.abspath(".."))
import aa
_

これを行った後、次のようにaaで関数を使用できます。aa.myfunc()

受け入れられた回答 for python:ディレクトリからモジュールをインポートする にいくつかの詳細情報があります

19
Caspar

Libディレクトリはpythonモジュールの検索パスにある必要があります。これは、シェルで使用される検索パスと同じではありません。

これはおそらくあなたのために働くでしょう:

import sys, os
sys.path.append(os.path.abspath(".."))

ただし、libパッケージがすでにパス上にあるコンテキストからコードを実行する方がおそらく良いでしょう。 'proj'ディレクトリなどから。

2
Matimus

私も同様の問題を抱えていました。ここに私のアドバイスがあります。

sys.pathを変更する代わりに、test.pyをproj(つまりプロジェクトルート)ディレクトリから実行することをお勧めします。このようにして、プロジェクトディレクトリは自動的にsys.pathになり、libパッケージをインポートできるようになります。

そして、絶対インポートを使用します。

1
warvariuc

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と呼びます。

1
gfortune

システムPATH変数はpython importステートメントでは使用されません。PYTHONPATHを使用しますが、検索パスをインポートするために新しいディレクトリを追加する最良の方法は、sys.pathを変更することです。

これで問題が解決しない場合は、sys.pathの値とos.getcwd()によって返される値を質問に追加してください。

0
Scorpil