- app.py
- Datatypes/
- string/
- __init__.py
- SomeModule.py
我的python应用程序动态加载包,在Datatypes目录中加载每个包,如果字符串模块( init .py)想要导入SomeModule.py,它必须使用来自app的路径。 py(正在执行的文件) 例如
import Datatypes.string.SomeModule
我宁愿有办法导入相关模块,而不必知道包的名称(目录名) 例如
import __self__.SomeModule
这可能吗?如果是这样,我将如何实现这个
答案 0 :(得分:1)
如果您不知道路径,请使用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
)或稍后要使用的模块中的元素的引用。
答案 1 :(得分:1)
如果文件在同一目录中,那么您可以使用正常的
import module_name
如果已启用absolute imports,则仍可以使用
导入相对路径from . import module_name
答案 2 :(得分:0)
我在临时目录中创建了一个类似的结构:
.
./main.py
./package
./package/__init__.py
./package/sub_module.py
main.py
只是将所有包的变量导入到自己的命名空间中并打印命名空间的内容:
from package import *
from pprint import pprint
print(dir())
导入包时会运行package/__init__.py
文件。它使用 relative 模块引用来指定可以在同一目录中找到所需的模块:
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
中的名称通过包名称空间导入主模块的命名空间。
因为包可以具有递归结构,所以您可以使用两个点来表示包含包上方的包,三个点指示包含该包的包,依此类推。虽然如果你需要三个以上的点,你可能需要考虑重构: - )。
该系统是在PEP 328中设计和记录的。