2016-09-01 15 views
3

我有由兩個包像這樣的項目:導入模塊不通過終端工作,而它的工作原理通過IDE

MyProjectDir 
-Package1 
--__init__.py 
--file1_1.py 
--file1_2.py 
--file1_3.py 
-Package2 
--__init__.py 
--file2_1.py 
--file2_2.py 
--file2_3.py 

現在,在包中的文件有文件之間的一些進口:

file2_3.py:

​​3210

當我從PyCharm運行file2_3.py直接,一切運行正常。但是,當我嘗試運行在終端腳本(我使用的是Windows 7):

D:\SVN Repo\MyProjectDir\Package2> python file2_3.py 

或可替代

D:\SVN Repo\MyProjectDir> python ./Package2/file2_3.py 

似乎Python不能看到我的包,我得到一個錯誤:

Traceback (most recent call last): 
    File "./Package2/file2_3.py", line 1, in <module> 
    from Package2.file2_1 import * 
ImportError: No module named 'Package2' 

是什麼原因?

編輯:如果在導入行我用from file2_1.py import *不帶包名,IDE強調進口爲「未解決的參考包2」(雖然它可以運行),以及終端運作...

+0

你可以在pycharm終端做一個'哪個python',並且在windows終端上做同樣的事情嗎?還檢查pycharm終端'導入sys'和'sys.path'和Windows終端相同,以檢查是否有任何區別 – lapinkoira

回答

2

問題是,你運行程序的方式是錯誤的,PyCharm知道如何處理python子模塊,從而正確執行文件。

如果你有一個模塊封裝package1package1.my_module你應該使用-m開關運行此:

python -m package1.my_module 

直接運行:

python package1/my_module.py <-- NO! Incorrect 

另外:你應該運行該文件來自外部的包。所以如果你的項目是:

MyProject 
    | 
    +- package1 
    | | 
    | +- file1.py 
    | 
    +- package2 
     | 
     +- file2.py 

你的工作目錄應該是MyProject

我的個人建議:從來沒有直接運行子模塊。取而代之的是將代碼放在單獨的腳本之外。所以我有:

MyProject 
    | 
    +- package1 
    | | 
    | +- file1.py 
    | 
    +- package2 
    | | 
    | +- file2.py 
    | 
    +- scripts 
     | 
     +- script1.py 

script1.py進口其所需的模塊:

from package1 import file1 
from package2 import file2 

# code 

然後你可以從你的MyProject目錄中運行該腳本:

python scripts/script1.py 

當你想部署您的代碼,您將編寫一個setup.py腳本,其中包含package1package2作爲包,而script1.py作爲一個腳本,它們將被安裝在正確的目錄中,以便您能夠從任何地方導入package1package2,並從各處運行script1.py

+0

耶,它的工作。 感謝這個全面的答案,讚賞! – Fidd