2017-12-04 7 views
0

を使うのですか、私はかなり単純にプロジェクト構造どのように私はPYTHONPATH

/home/user/project/ 
/home/user/project/bin/ 
/home/user/project/bin/myscript.py 
/home/user/project/lib/ 
/home/user/project/lib/mymodule/__init__.py 
/home/user/project/lib/mymodule/example.py 
を持って、私は私のスクリプトからロードするために私のモジュールとクラスファイルを取得するように見えることはできませんが、それはREPL

から罰金ロード

私はPython REPLを実行すると、すべて正常に動作します。

$export PYTHONPATH=./lib:$PYTHONPATH # Making sure that the REPL and script have access 
$python 
Python 2.7.8 blashblahblah 
... 
>from mymodule.example import MyClass 
>test = MyClass() 
>^D 
$./bin/myscript.py 
Traceback (most recent call last): 
    File "myscript.py", line 5, in <module> 
    from mymodule.example import MyClass 
    File "/path/to/myscript.py", line 5, in <module> 
    from mymodule.example import MyClass 
ImportError: No module named example 
+0

'python bin/myscript.py'についてはどうですか? * PYTHONPATH *はスクリプトを直接実行するときに設定されますか?ファイルの先頭で 'print(sys.path)'を試してみてください。ほとんどのことがクリアされます。 – CristiFati

+0

上記のコードでは、pythonpathを適切に設定してエクスポートしました。私は絶対パスではなく、絶対パスを使ってみました。 PYTHONPATHは、私のpythonパスをリセットするために、REPLに対してはっきりと正しく設定されています。 – W4t3randWind

答えて

0

私はここで自分の質問に答えるつもりです。 それは、スクリプト名が

bin/ 
bin/mymodule.py 
lib/ 
lib/mymodule/ 
lib/mymodule/__init__.py 
lib/mymodule/example.py 

REPLからのインポート、PYTHONPATHがlibに/のmymoduleモジュールに解決され、コードは(主に)正しくセットされている「mymodule.pyを」だったことが判明します。 mymodule.pyというスクリプトを実行する場合、Pythonインタプリタは、スクリプトのディレクトリbin/をpythonパスの前に付加します。 スクリプトは、mymoduleのimport文を見て、それ自身をソースします。スクリプト内で 'example'を探すためにトラバースできるネームスペースが見つからない場合は、ImportErrorをスローします。

解決策は、モジュールの名前を変更するか、スクリプトの名前を変更する(例:bin/my_module.py)、名前空間が衝突しないようにすることです。