[英]Python package import own files, without knowing the package name at compile time
- app.py
- Datatypes/
- string/
- __init__.py
- SomeModule.py
我的python應用程序動態加載包,將每個包都加載到Datatypes目錄中,如果字符串模塊( init .py)要導入SomeModule.py,則必須使用其來自app.py(正在執行的文件)的路徑來導入。
import Datatypes.string.SomeModule
我寧願有一種導入相關模塊的方法,而不必知道軟件包的名稱(目錄名稱)。
import __self__.SomeModule
這可能嗎? 如果是這樣,我將如何實現這一目標
如果您不知道路徑,請使用os.listdir()
找到它。
如果您知道路徑,請使用__import__
:
>>> math.factorial(10)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'math' is not defined
>>> mod='math'
>>> math=__import__(mod)
>>> math.factorial(10)
3628800
當然,您需要保留對模塊(在我的示例中為變量math
)或以后要使用的模塊中元素的引用。
我在一個臨時目錄中創建了一個類似的結構:
.
./main.py
./package
./package/__init__.py
./package/sub_module.py
main.py
只是將包的所有變量導入其自己的名稱空間,並輸出該名稱空間的內容:
from package import *
from pprint import pprint
print(dir())
package/__init__.py
文件在導入程序包時運行。 它使用相對的模塊引用來指定可以在同一目錄中找到所需的模塊:
from .sub_module import *
package/sub_module.py
模塊由包的__init__.py
導入。 它只是設置了三個變量:
x = y = z = 0
程序運行時...
airhead:tmp sholden$ python main.py
['__builtins__',
'__doc__',
'__file__',
'__name__',
'__package__',
'pprint',
'sub_package',
'x',
'y',
'z']
您會看到,來自package\\sub_module.py
的名稱是通過package名稱空間導入到主模塊的名稱空間中的。
因為包可以具有遞歸結構,所以可以使用兩個點表示包含包上方的包,使用三個點指示包含該包的包,依此類推。 雖然如果您需要三個以上的點,則可能需要考慮重構:-)。
該系統是在PEP 328中設計和記錄的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.