私は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
は '輸入sys'を追加評価しますあなたのスクリプトの始めに 'print(sys.path)'を実行し、パスを確認してください。しかし、ほとんどの場合、_python_を起動する前に 'PYTHONPATH =〜/ dev/code_playground:$ {PYTHONPATH}'をエクスポートする必要があります。 – CristiFati
ありがとう@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'] ' –
Windowsでは、code_playgroundディレクトリがsysに含まれています。 PYTHONPATHを設定することなく、virtualenvを実行した後のパス。しかし、これはLinuxでは当てはまりません。私はそれがWindowsで動作する理由だと思います。@CristiFati(または他の誰か)、なぜそれがあるのかについての洞察を持っていますか? –