2009-07-11 9 views
57

ローカルディレクトリにパッケージを開発/テストしています。私はそれをインタプリタ(v2.5)でインポートしたいが、sys.pathには現在のディレクトリは含まれていない。今私はsys.path.insert(0,'.')と入力します。より良い方法がありますか?Pythonパッケージをローカルディレクトリからインタプリタにインポートします

はまた、

from . import mypackage 

は、このエラーで失敗します。sys.pathを使用して

ValueError: Attempted relative import in non-package 
+0

あなたがいることを読みましたPythonモジュールですか? –

+9

@Lott:ここで説明する相対インポートパスです:http://docs.python.org/reference/simple_stmts.html#the-import-statement – projectshave

答えて

28

相対インポートは、パッケージの一部としてインポートされたモジュールでのみ使用できます。スクリプトまたはインタラクティブなインタープリタは含まれていませんでした。もちろん、from . import(「同じパッケージからインポートしますからインポートされた)は機能しません。 import mypackageはあなたがmypackageの親ディレクトリがsys.pathであることを確認したら、細かいこと(あなたが離れsys.pathからあなたの現在のディレクトリを取得するために管理方法を私は知らないだろう - あなたはsite.pyで奇妙な何かを持っているか、または... ?)

現在のディレクトリをsys.pathに戻すには、実際にそこに置くよりも良い方法はありません。

+0

Ubuntu 8.10用のPython 2.5では、インタプリタのsys.pathにカレントディレクトリ(空文字列)がありません。私は何も変えなかったので、何とかそのように出荷されました。私はちょうど3.0をインストールし、sys.pathにはsys.pathに ''があります。 – projectshave

+0

@projectshave、OK、Ubuntuの理由は間違いありません!私は8.04(現時点では職場で使用しているもの)に気づいていませんが、十分な注意を払っていない可能性があります。 –

+1

私は部分的に間違っています。シェルから呼び出されたPythonはsys.pathにカレントディレクトリを持っています。 Emacsから起動されたPythonには現在のディレクトリがありません。奇妙な。 – projectshave

2

はすでに、現在のディレクトリを含める必要があります。

試してみてください。

import . 

か:

from . import sth 

それは良い習慣ではないことが、なぜだけで使用することはできませんが:

import mypackage 
+1

の問題は、グローバルからパッケージをロードすることですpython env、パッケージ/ファイルをローカルフォルダから読み込むかもしれませんが、作業環境にある他のランダムなmypackgeをロードすることもできます。 –

12

はSYSのマニュアルを参照してください。経路:

引用する

:あなたのモジュールを含むディレクトリからPythonインタプリタを起動している場合

If the script directory is not available (e.g. if the interpreter is invoked interactively or if the script is read from standard input), path[0] is the empty string, which directs Python to search modules in the current directory first.

だから、のsys.pathとサルの必要はありません。

はまた、あなたのパッケージをインポートするには、単に実行します。

import mypackage 

パッケージを含むディレクトリがのsys.pathにすでにあるので、それが正常に動作する必要があります。

+0

同様のファイル名が作業環境の他の場所に存在すると、失敗します。 –

+0

@ JAR.JAR.beans現在の作業ディレクトリは 'sys.path'の最初のものでなければならないので、そこにあるファイルは作業環境の他の場所のファイルの前に見つかるはずです。 – SpoonMeiser

+0

良い点。つまり、ローカルディレクトリからファイルを実行するとします。そのような場合は、他のフォルダでsys.pathへの変更が必要な場合は 'sys.path.append(new_path)'ではなく 'sys.path.insert(0、new_path)'を意味します。 –

4

簡単な方法は、Pythonの-mフラグを使用して、親ディレクトリからスクリプトを実行することです。 python -m packagename.scriptname。明らかにこの状況では、ディレクトリをパッケージにするためには__init__.pyファイルが必要です。

4

それをシンプルに保つ:

try: 
    from . import mymodule  # "myapp" case 
except: 
    import mymodule   # "__main__" case 
+3

私はこのソリューションが好きです、それは最も簡単です。唯一残っている質問は、輸入を実装する際に「それを行う唯一の方法」のルールがオプションとみなされた理由です...真剣に言えば、パッケージを宣言して整理する約15の方法がありますが、そのすべてに欠点があります –

5

あなたはそれが特定のローカルディレクトリからライブラリをインポートので、そのままPythonスクリプトを実行したい場合は、PYTHONPATH環境変数を設定することができます - 例えば

export PYTHONPATH=/home/user/my_libs 
python myscript.py 

あなたはちょうどそれが.表記を使用現在の作業ディレクトリからインポートする場合:bashで、「」

export PYTHONPATH=. 
python myscript.py 
関連する問題