2017-09-01 13 views
0

私はUbuntu 17で動作するPythonプロジェクトを取得しようとしていますが、モジュールの読み込みに問題があります。私は簡単な例で問題を切り分けることができました。この例はWindows 10では動作しますが、Ubuntuでは動作しません。これを働かせることを助けることは大いに評価されるでしょう!親ディレクトリのモジュールをインポートできません

まず私は〜/ devにプロジェクトディレクトリと呼ばれるcode_playgroundを作成します。

は、ここで私は、次の午前の手順です。次の私は、このプロジェクトのためにvirtualenvのを作成します。

~/dev$ which virtualenv 
/usr/local/bin/virtualenv 

~/dev$ virtualenv -p python3.6 code_playground/ 
Running virtualenv with interpreter /usr/bin/python3.6 
Using base prefix '/usr' 
New python executable in /home/user/dev/code_playground/bin/python3.6 
Also creating executable in /home/user/dev/code_playground/bin/python 
Installing setuptools, pip, wheel...done. 

私は仮想環境アクティベート:動作しているよう

~/dev/code_playground$ source ./bin/activate 
(code_playground) ~/dev/code_playground$ 

を:

(code_playground) ~/dev/code_playground$ which python 
/home/user/dev/code_playground/bin/python 

私はmod_a.pyというファイルを作成しますその中の単純な機能:

def print_name(name): 
    print('Your name is {0}'.format(name)) 

は今、私はサブと呼ばれるサブディレクトリを作成:私はmod_b.pyを実行しようが、私は取得

from mod_a import print_name 

print_name('Joe') 

:サブインサイド

(code playground) ~/dev/code_playground$ mkdir sub 
(code playground) ~/dev/code_playground$ cd sub 
(code playground) ~/dev/code_playground/sub$ 

を、私はこれらの内容でmod_b.pyというファイルを作成しますエラー:

(code playground) ~/dev/code_playground/sub$ python mod_b.py 
Traceback (most recent call last): 
    File "mod_b.py", line 1, in <module> 
     from mod_a import print_name 
ImportError: No module named mod_a 
+0

は '輸入sys'を追加評価しますあなたのスクリプトの始めに 'print(sys.path)'を実行し、パスを確認してください。しかし、ほとんどの場合、_python_を起動する前に 'PYTHONPATH =〜/ dev/code_playground:$ {PYTHONPATH}'をエクスポートする必要があります。 – CristiFati

+0

ありがとう@CrisiFati。それは問題を解決します。私はLinuxでこれがなぜ必要なのかについての洞察はありますか? virtualenvの後で、PYTHONPATH変数を設定する前に、mod_b.pyのsys.pathの内容を次に示します。 '['/ home/user/dev/code_playground/sub'、 '/ home/user/dev/code_playground/lib/python36.zip '、 ' /home/user/dev/code_playground/lib/python3.6 '、 ' /home/user/dev/code_playground/lib/python3.6/lib-dynload '、 '/usr/lib/python3.6'、 '/home/user/dev/code_playground/lib/python3.6/site-packages'] ' –

+0

Windowsでは、code_playgroundディレクトリがsysに含まれています。 PYTHONPATHを設定することなく、virtualenvを実行した後のパス。しかし、これはLinuxでは当てはまりません。私はそれがWindowsで動作する理由だと思います。@CristiFati(または他の誰か)、なぜそれがあるのか​​についての洞察を持っていますか? –

答えて

0

module_a.pyの場所をPythonインタプリタが知っている必要があります。モジュールmodule_a.pyをインポートしているファイルが、module_a.pyが存在するディレクトリのサブディレクトリにあるという事実は、 "あまり役に立たないこと"です。

1 @CristiFatiが提案しているように、あなたのmod_a.pyパス(スクリプト実行前)をPythonのパスに追加してください。

2-(嫌なもの)のようなものをやって、あなたのPythonのパスに(Pythonのコードを使用して)あなたのmod_a.pyのパスを追加します。

import 
sys.path.insert(0, '/home/user/dev/code_playground/bin/python') 
from mod_a import print_name 
... 

3-相対的な輸入(6.4.2. Intra-package References

関連する問題