ローカルディレクトリでパッケージを開発/テストしています。インタプリタ(v2.5)にインポートしたいのですが、sys.pathに現在のディレクトリが含まれていません。今、私はを入力しsys.path.insert(0,'.')ます。もっと良い方法はありますか?
また、
from . import mypackage
このエラーで失敗します:
ValueError: Attempted relative import in non-package
ローカルディレクトリでパッケージを開発/テストしています。インタプリタ(v2.5)にインポートしたいのですが、sys.pathに現在のディレクトリが含まれていません。今、私はを入力しsys.path.insert(0,'.')ます。もっと良い方法はありますか?
また、
from . import mypackage
このエラーで失敗します:
ValueError: Attempted relative import in non-package
回答:
相対インポートは、パッケージの一部としてインポートされたモジュール内からのみ使用できます。スクリプトまたはインタラクティブインタープリターはそうではなかったので、もちろんfrom . import(つまり、「インポート元と同じパッケージからインポート」)は使用しません。動作しません。import mypackageの親ディレクトリmypackageが入っsys.pathていることを確認したら問題ありません(現在のディレクトリをどのようにして私から遠ざけるsys.pathことができたのかわかりません-site.pyに何か奇妙なものがありますか...?)
現在のディレクトリをsys.pathそこに戻すことは、実際、そこに置くよりも良い方法はありません。
sys.pathのドキュメントを参照してください。
http://docs.python.org/library/sys.html#sys.path
引用するには:
スクリプトディレクトリが利用できない場合(たとえば、インタプリタがインタラクティブに呼び出される場合、またはスクリプトが標準入力から読み取られる場合)、path [0]は空の文字列であり、Pythonに現在のディレクトリ内のモジュールを最初に検索するように指示します。
したがって、モジュールを含むディレクトリからpythonインタープリターを起動する場合は、sys.pathを使用する必要はありません。
また、パッケージをインポートするには、次のようにします。
import mypackage
パッケージを含むディレクトリはすでにsys.pathにあるので、正常に機能するはずです。
sys.path配置する必要があるため、作業環境内の他の場所のファイルよりも先にファイルが見つかるはずです。
sys.path.insert(0, new_path)ではなくを意味しsys.path.append(new_path)ます。
変更されていないPythonスクリプトを実行して、特定のローカルディレクトリからライブラリをインポートする場合は、PYTHONPATH環境変数を設定できます(例:bash)。
export PYTHONPATH=/home/user/my_libs
python myscript.py
現在の作業ディレクトリからインポートするだけの場合は、次の.表記を使用します。
export PYTHONPATH=.
python myscript.py
複雑にしないでおく:
try:
from . import mymodule # "myapp" case
except:
import mymodule # "__main__" case
それを機能させる簡単な方法は、Pythonの-mフラグを使用して親ディレクトリからスクリプトを実行することpython -m packagename.scriptnameです。明らかに、この状況では__init__.py、ディレクトリをパッケージに変換するためのファイルが必要です。
使用にsys.pathは、現在のディレクトリがすでに含まれている必要があります。
試してみてください:
import .
または:
from . import sth
ただし、それは良い習慣ではないかもしれないので、なぜ単に使用しないのですか?
import mypackage
パーティーに少し遅れましたが、これが私にとってうまくいったことです:
>>> import sys
>>> sys.path.insert(0, '')
どうやら、空の文字列がある場合、Pythonは現在のディレクトリを検索する必要があることを認識しています。に空の文字列がないため、sys.pathこのエラーが発生しました。