2017-09-01 109 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)) 

現在我創建一個子目錄稱爲子:

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

裏子,我創建了一個名爲mod_b.py這些內容的文件:

from mod_a import print_name 

print_name('Joe') 

我嘗試運行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中,但在Windows中沒有它?在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中。運行virtualenv之後的路徑,而不必設置PYTHONPATH。但是,在Linux中並非如此。我想這就是它在Windows中工作的原因。@CristiFati(或任何其他人),你碰巧有什麼洞察力,爲什麼這是? –

回答

0

Python解釋器必須知道在哪裏可以找到module_a.py。導入模塊module_a.py的文件位於module_a.py存在的目錄的子目錄中,「這不是一件大有裨益的事情」。你可以嘗試一些東西:

1-根據@CristiFati的建議,將您的mod_a.py路徑(在腳本運行之前)添加到Python路徑中。

2 - 你mod_a.py路徑(使用Python代碼)到您的Python的路徑做一些像添加(討厭的一個):

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