2017-07-03 84 views
3

對不起,這絕對是重複的,但我找不到答案。我在Python 3個工作,這是我的應用程序的結構:如何導入Python文件?

/home 
    common.py 
    australia/ 
    new-south-wales/ 
     fetch.py 

我在home/目錄,運行fetch.py。如何在該腳本中導入common.py中的函數?

我已經設置了fetch.py如下:

from common import writeFile 

,但我得到了以下錯誤:

File "australia/new-south-wales/fetch.py", line 8, in <module> 
    from common import writeFile 
ModuleNotFoundError: No module named 'common' 

如果我只是做python -c "from common import writeFile"我沒有看到一個錯誤。

不應該翻譯look in the current directory for modules

+1

你錯過了一個'__init __ py'爲模塊。 https://docs.python.org/3/tutorial/modules.html#packages –

回答

5

之前導入您的目錄,需要進口必須有文件__init__.py該文件夾中

#solution 1(在運行時進口)

要在「運行」中導入特定的Python文件用已知名稱:

import os 
import sys 
script_dir = "/path/to/your/code/directory" 

# Add the absolute directory path containing your 
# module to the Python path 

sys.path.append(os.path.abspath(script_dir)) 

import filename 

#solution 2(文件添加到Python庫中的一個)

也因爲你有一個共同的庫可以運行

>>> import sys 
>>> print sys.path 

,看看哪些目錄,你可以把你的代碼,並在每次使用project.you可以您共同包移動到該目錄中,並把它像common.py正常package.for例如,如果你把它放在這個目錄中的一個的一個根目錄就可以導入像import common

#solution 3(使用相對進口)

# from two parent above current directory import common 
# every dot for one parent directory 
from ... import common 

,然後轉到父目錄並運行

python -m home.australia.new-south-wales.fetch 
+0

Thanks.This似乎很不雅 - 是否有更好的方式來共享不同子目錄中腳本之間的常用函數? (另外,我想你的意思是'__init __。py'?) – Richard

+0

我在'home /'中添加了一個空的'__init __。py'文件,並且我添加了'scriptpath =「../../common。在'fetch.py​​'中後面跟着'import common'。嘗試從'home /'運行'fetch.py​​'時仍然出現錯誤。 – Richard

+0

是的,我的意思是'__init __。py';我也使用這種方式;將腳本路徑改爲'「../../」' –

1

從我假設你沒有運行此爲完整的Python包,只是作爲單獨的文件說明。

你可以做的是使用完整的模塊。這意味着使用您的代碼將空的__init__.py添加到目錄。您還必須將new-south-wales的名稱更改爲new_south_wales,因爲它需要是有效的模塊名稱。

假設home是你的應用程序的名稱,你應該結束了:

home/ 
    __init__.py 
    common.py 
    australia/ 
    __init__.py 
    new_south_wales/ 
     __init__.py 
     fetch.py 

接下來,你需要一個啓動腳本爲您的應用程序 - 這意味着無論是簡單的東西,如:

#!/usr/bin/env python 
from australia.new_south_wales import fetch 
fetch.your_main_function() 

或者您可以添加一個setup.py以及完整的包裝說明。如果您指定entry points並且該腳本將自動創建。

現在,你開始在包的情況下你的代碼,你fetch.py可以這樣做:

from ..common import writeFile