2017-10-06 60 views
1

運行Python 3.6.1,並試圖從我的項目中的另一個包中導入文件(world.py)。在Python 3中的嵌套包之間導入

我的目錄結構:

+-- test_project 
| +-- sub_project1 
| | +-- __init__.py 
| | +-- hello.py 
| +-- sub_project2 
| | +-- __init__.py 
| | +-- world.py 

hello.py

def say_hello(): 
    return("Hello ") 

world.py

from test_project.sub_project1.hello import say_hello 

print(say_hello() + "world!") 

當我進入sub_project2目錄,並運行world.py,我不斷收到這樣的:

ModuleNotFoundError: No module named 'test_project' 

我試過重寫導入語句到from sub_project1.hello import say_hello。我也嘗試在我的PATH環境變量中使用test_project目錄。我試過在我的路徑中有test_project父目錄目錄。我試過在我的PATH中有sub_project2的目錄。我在網上搜索了答案,無法計算出我錯過的內容。

我在這裏做錯了什麼?

回答

1

你需要 「hello.py」 的路徑添加到sys.path

import sys 
sys.path.append('../sub_project1') 

from hello import say_hello 

print(say_hello() + "world!") 

輸出:

Hello world! 

來源是here。這個討論真的很有幫助。

編輯:因爲 「sub_project1」 有__init__.py,你可以使用:

import sys 
sys.path.append('..') #Adds upper directory sys.path 

from sub_project1.hello import say_hello 

print(say_hello() + "world!") 
+0

感謝的是,這似乎是最簡單的解決方案。我喜歡Python,但是包和導入可能有時是一種絕對的痛苦...... – Megdatronica

+0

不客氣。我同意,我也愛Python。沒有刺就沒有玫瑰。每種語言都有強硬的一面。另外,不要忘記閱讀我上面給出的鏈接,這對導入非常有幫助。 – Alperen

1

的問題是,你有你的項目添加到Python路徑。原因是python首先在這些位置搜索:

  1. 包含輸入腳本(或當前目錄)的目錄。

  2. PYTHONPATH(目錄名稱列表,其語法與shell變量PATH相同)。

  3. 安裝依賴的默認值。

所以,你必須添加到PYTHONPATH環境變量中的目錄C:\Users\your_user\dir_before_test_project\