2016-04-26 43 views
0

我有兩個項目,組織根據以下結構如何讓這個文件夾結構作爲Python模塊工作?

core 
* src 
    * main 
    * python 
     * module 
     * __init__.py 
     * tools.py 
extension 
* src 
    * main 
    * python 
     * module 
     * submodule 
      * __init__.py 
      * usercode.py 

同時考慮src/main/pythonPYPATH

不幸的是,當我做import module.submodule.usercode,我得到的是

ImportError: No module named submodule 

哪有我解決這個問題?

編輯1

通知我想從我的分機使用tools.py從我的核心模塊旁邊的usercode.py ......其中,根據Python模塊加載機制,使它不可能對我來說,有一個__init__.py文件在我的extension/src/main/python/module文件夾中,就像建議的大多數答案一樣。

EDIT 2

我要細說了

  • 的幾件事情在生產模式中,Python代碼是由行家過程中提取並組裝成一個簡單的文件夾尋找或多或少像

    • 模塊
      • 初始化的.py
      • tools.py
      • 子模塊
      • 初始化的.py
      • tools.py
  • 在開發者模式,separatly存在兩個項目,我從extension/src/test運行代碼。

很明顯,我的問題只存在於開發模式。

回答

0

最後,我在測試類使用__init__.py,從core在測試開始複製到extension有代碼普通的目錄,並刪除在測試結束。對於代碼分發,我依靠一些魔法魔術。

0

確保您所有的Python包中都有一個__init__.py

extension 
* src 
    * main 
    * python 
     * module 
     * __init__.py # You're missing one here 
     * submodule 
      * __init__.py 
      * usercode.py 
+0

編輯問題,指出爲什麼這個解決方案不適用於我。 – Riduidel

+0

@Riduidel你使用哪個模塊?什麼是文件夾結構? – Bahrom

1

packages文檔:

__init__.py文件,才能使Python視該目錄爲一個包;這是爲了防止具有通用名稱的目錄(例如字符串)無意中隱藏稍後在模塊搜索路徑中發生的有效模塊。在最簡單的情況下,__init__.py可以只是一個空文件,但它也可以執行包的初始化代碼或設置__all__變量,稍後介紹。

所以治療module目錄作爲一個包,你需要往其中加一個__init.py__文件:

extension 
* src 
    * main 
    * python 
     * module 
     * __init__.py # add this file to treat the directory as a module 
     * submodule 
      * __init__.py 
      * usercode.py 

UPDATE:

從你使用的文件夾模式,它看起來更像一個java項目的組織。在python你並不需要這麼複雜的結構。但如果你真的想要這個結構,你需要將__init__.py添加到所有的文件夾中。

但是我建議是這樣的:

core 
    * __init__.py 
    * module 
    * __init__.py 
    * tools.py 

extension 
    * __init__.py 
    * module 
    * __init__.py 
    * submodule 
     * __init__.py 
     * usercode.py 

然後可以導入類似以下內容:

from core.module import tools 

,或者

from extension.module.submodule import usercode 

請注意__init__.py文件中的每個目錄,儘管我刪除了一些目錄以使結構看起來更加pythonic。

+0

編輯的問題,以表明爲什麼這種解決方案不適用於我(但我upvoted你的答案,但迄今爲止,這是迄今爲止最好的) – Riduidel

+0

@Riduidel請檢查更新的答案。 – AKS

0

模塊還需要一個__init__文件,因此這將是一個Python包,而不是