2016-06-11 78 views
1

我是一名計算機科學專業的第一年級學生,目前正在從事一個小型項目,並將其保存到學校的保管箱中。如何在python包的開發過程中正確導入?

對於一個潛在的微不足道的問題,我提前道歉。但幾乎沒有經驗,並嘗試所有我已經教過的調試技術後,我真的陷入了困境!

它具有以下文件結構

school_project/ 
    __init__.py  #(empty) 
    main_functions/ 
     __init__.py #(empty) 
     render.py 
     filter.py 
    helper_functions/ 
     __init__.py #(empty) 
     string.py 
     utility.py 

目前,我需要的文件render.py在使用創立於utility.py功能。我第一次嘗試解決這個問題的方法是在文件render.py中執行import ..helper_functions.utility

不幸的是,它遇到了以下錯誤消息。

import ..helper_functions.utility 
    ^
SyntaxError: invalid syntax 

首先,我不知道爲什麼這個相對導入不起作用。

其次,我應該使用絕對導入嗎?在形式import school_project.helper_functions.utility?如果是這樣,那麼我需要添加school_project/目前的目錄到PYTHONPATH?我將如何做到這一點?

請問我只是修改我的電腦的PATHPYTHONPATH將做出相應的調整?還是他們是分開的實體,這個過程有點牽扯?我查看了其他線程,但他們似乎都在運行時修改了Python腳本本身的PYTHONPATH,我認爲這是未來錯誤的巨大潛在來源。

回答

1

這是你應該做的方式:

from ..helper_functions import utility 

如果正常運行的Python程序這將無法正常工作,由於相對進口。

這是你應該運行的方式:

python3 -m helper_functions.utility 

但它有點冗長,不喜歡#一個shebang行拌勻的/ usr/bin中/ env的python3!

雖然它不是唯一的。你的包裝結構更復雜。您需要在PYTHONPATH中包含包含您的軟件包目錄的目錄,並執行此操作。

從mypackage.mymodule進口as_int

你也可以做到這一點。但這對初學者不推薦。 你只需先在代碼中使用PYTHONPATH ...

import sys 
import os 

PACKAGE_PARENT = '..' 
SCRIPT_DIR = os.path.dirname(os.path.realpath(os.path.join(os.getcwd(), os.path.expanduser(__file__)))) 
sys.path.append(os.path.normpath(os.path.join(SCRIPT_DIR, PACKAGE_PARENT))) 

from mypackage.mymodule import as_int 
+0

感謝您的回覆。錯誤沒有消失。同樣的語法錯誤,但現在指向'helper_functions'和'utility'之間'''的時間段 – AlanSTACK

+1

似乎我們正在取得進展:) –

+0

試試這個:'from ..helper_functions import utility' –

0

絕對進口量推薦佩普8:

Absolute imports are recommended, as they are usually more readable and tend to be better behaved (or at least give better error messages) if the import system is incorrectly configured (such as when a directory inside a package ends up on sys.path):

對於PYTHONPATH,每個地方你的項目可能是最適合現在的工作終端會話設置一次。一旦你繼續使用像pycharm這樣的IDE,這將自動爲你管理

+1

相對進口不再那麼灰心,看到這個答案:https://stackoverflow.com/questions/4209641#answer-16748366 – Pawamoy

+1

這個措辭不包括在[當前版本的pep8](https://www.python .ORG的/ dev/PEPS/PEP-0008 /)。相反,它表示:建議使用_Absolute導入,因爲它們通常更具可讀性,並且如果導入系統配置不正確(例如,當包內的目錄結束時,它往往會表現得更好(或至少提供更好的錯誤消息) sys.path):_ –

+0

更新,謝謝。 – renemilk