2009-04-20 63 views
3

假設我有這樣的準系統結構:如何將Python代碼結構化爲模塊/包?

project/ 
    main.py 
    providers/ 
    __init.py__ 
    acme1.py 
    acme2.py 
    acme3.py 
    acme4.py 
    acme5.py 
    acme6.py 

假設main.py包含(部分):

if complexcondition(): 
    print providers.acme5.get() 

哪裏__init__.py是空的,acme*.py包含(部分):

def get(): 
    value=complexcalculation() 
    return value 

如何我更改這些文件的工作?

注意:如果答案是__init__.py中的「import acme1」,「import acme2」等等,有沒有辦法在沒有手動列出的情況下完成該操作?

+1

使用from providers import *正如你所描述的那樣應該已經工作。 ..你有什麼問題? – 2009-04-20 23:11:10

+0

Duplicate:http://stackoverflow.com/questions/106896/how-many-python-classes-should-i-put-in-one-file; http://stackoverflow.com/questions/171785/how-do-you-organize-python-modules; http://stackoverflow.com/questions/391879/organising-my-python-project – 2009-04-21 15:36:54

回答

3

今天提問這個問題,Dynamic Loading of Python Modules,應該有你的答案。

+0

不是我所希望的,但它使我成爲一個可行的解決方案,謝謝。 – arantius 2009-04-21 00:54:42

5

如果我正確地閱讀你的問題,它看起來像你沒有試圖做任何動態導入(就像範蓋爾提到的問題一樣),但實際上只是試圖導入提供者中的所有模塊包。如果是這樣的話,在__init__.py你想有這樣的說法:

__all__ = ["acme1", "acme2", "acme3", "acme4", "acme5", "acme6"] 

然後導入你會從...導入*

from providers import * 

然後,而不是使用包名使用一切明確的代碼,你只需調用導入的類

acme1.get() 
acme2.get() 

如果在它成爲填充0123個問題的供應商包足夠的模塊列表中,您可能想要考慮將它們分成更小的包或以其他方式存儲數據。我個人不希望每次想重新使用該軟件包都必須處理動態導入schennagins。

6

嘿!兩年後,但...也許可能是有益的一些一個

讓你提供商/ __ init__.py這樣的:

import os 
import glob 

module_path = os.path.dirname(__file__) 
files = glob.glob(os.path.join(module_path, 'acme*.py')) 
__all__ = [os.path.basename(f)[:-3] for f in files] 

你不必以後改變它,如果添加或刪除任何提供商/ ACME *的.py

然後在main.py