2017-02-27 99 views
1

我試圖從多個位置導入模塊,但無法使其工作,因爲Python3中的相對導入已被禁用。我想這樣做,以便用戶可以複製package_1並在終端上運行它(使用主類);而另一個類被導入到作爲web應用程序前端的scriptb.py中。從多個位置導入模塊時python3相對導入

-- projectfolder 
-- projectfolder/ 
-- __init__.py 
--- package_1/ 
------ __init__.py 
------ subpackage_a/ 
------ subpackage_a/core/module1.py 
------ subpackage_a/__init__.py 
------ subpackage_a/core/__init__.py 
------ run.py 
--- package_2/ 
----- __init__.py 
-- -- scriptb.py 

在此間舉行的 「package_1/run.py」 進口: 從subpackage_a.core.module1進口類名

這裏是 「package_2/scriptb」 進口: package_1.run進口類名

然而,當我運行scriptb.py我得到run.py 導入錯誤以下錯誤:沒有模塊名爲「package_1.core」

Traceback: 
File "/directory/package_1/run.py", line 7, in <module> 
    from subpackage_a.common.exceptions import Classname 
ImportError: No module named 'subpackage_a.common' 

有沒有更好的方法來處理這個問題,然後捕獲ImportError異常並在所有「package_a」模塊中定義兩個導入位置?

或不是做這個這意味着導入每個模塊兩次

if __name__ == '__main__': 
    from package_1 import classname 
else: 
    from .package_1 import classname 

感謝

編輯好:

以供將來參考我不得不這樣做的子包導入其他模塊核心文件夾

try: 
    from package_1.core.module1 import classname: 
except ImportError: 
    from ..core.module2 import classname 

以下僅作品主:

if __name__ == '__main__': 
    from package_1.core.module1 import classname: 
except ImportError: 
    from .package_1.core.module2 import classname 

回答

1

所有子目錄必須__init__.py,如果你想使用它作爲一個包。嘗試實現以下文件結構。

-- projectfolder 
-- projectfolder/ 
-- __init__.py 
--- package_1/ 
------ __init__.py 
------ subpackage_a/ 
-----------__init__.py********** 
------ subpackage_a/core/module1.py 
-------------------core/ 
-----------------------__init__.py********** 
------ run.py 
--- package_2/ 
----- __init__.py 
-- -- scriptb.py 

__init__.py文件添加到subpackage_a文件夾和subpackage_a /核心/文件夾

編輯:我覺得你處理這種方式是更好的選擇

if __name__ == '__main__': 
    from package_1 import classname 
else: 
    from .package_1 import classname 
+0

感謝您的回覆。所有的軟件包都有__init__.py文件。我將編輯帖子,因爲我忘了輸入它們。 – budge

+0

該死的,我不能使用「if __name__ =='__main__':」在子包內,因爲它們不被稱爲主程序,所以我仍然這樣做有同樣的問題。假設我必須捕獲ImportError異常.. – budge

1

那麼,正如你可以看到你的文件夾結構和使用「subpac 「package_1/run.py」和「package_2/scriptb.py」中的「kage_a」,實際上,「subpackage_a」不是「package_1」的子包。更好地調整項目的實際情況,使「subpackage_a」成爲一個真正的軟件包,並使用distutils或類似軟件將它安裝到python中。然後,「run.py」和「scriptb.py」都可以使用它,而不會回覆到任何相關的導入攻擊。