簡體   English   中英

Python包導入自己的文件,而在編譯時不知道包名稱

[英]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 )或以后要使用的模塊中元素的引用。

如果文件位於同一目錄中,則可以使用普通文件

import module_name

如果已打開絕對導入 ,則仍可以使用以下命令導入相對路徑

from . import module_name

我在一個臨時目錄中創建了一個類似的結構:

.
./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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM