Python包导入自己的文件,编译时不知道包名
我的python应用程序动态加载包,加载Datatypes目录中的每个包,如果字符串模块(init.py)想要导入SomeModule.py,它必须使用app.py(正在执行的文件)中的路径进行导入 例如 我希望有一种导入相关模块的方法,而不必知道包的名称(目录名) 例如Python包导入自己的文件,编译时不知道包名,python,python-2.7,dynamic,python-3.x,import,Python,Python 2.7,Dynamic,Python 3.x,Import,我的python应用程序动态加载包,加载Datatypes目录中的每个包,如果字符串模块(init.py)想要导入SomeModule.py,它必须使用app.py(正在执行的文件)中的路径进行导入 例如 我希望有一种导入相关模块的方法,而不必知道包的名称(目录名) 例如 这可能吗?如果是这样,我将如何实现这一点如果您不知道路径,请使用os.listdir()找到它 如果您知道路径,请使用\uuuuu导入>>mod='math' >>>数学=导入(mod) >>>数学阶乘(10) 3628800
这可能吗?如果是这样,我将如何实现这一点如果您不知道路径,请使用
os.listdir()
找到它
如果您知道路径,请使用\uuuuu导入
:
import __self__.SomeModule
数学阶乘(10)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
NameError:未定义名称“math”
>>>mod='math'
>>>数学=导入(mod)
>>>数学阶乘(10)
3628800
当然,您需要保留对模块(在我的示例中为变量
math
)或模块中稍后要使用的元素的引用。如果文件位于同一目录中,则可以使用普通
>>> 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
如果已启用,则仍可以使用导入相对路径
import module_name
我在临时目录中创建了类似的结构:
from . import module_name
from package import *
from pprint import pprint
print(dir())
main.py
只需将包的所有变量导入到自己的命名空间中,并打印命名空间的内容:
.
./main.py
./package
./package/__init__.py
./package/sub_module.py
导入包时,package/\uuuuu init\uuuuu.py
文件将运行。它使用相对的模块引用来指定所需的模块可以在同一目录中找到:
from . import module_name
from package import *
from pprint import pprint
print(dir())
package/sub_module.py
模块由包的\uuuu init\uuuu.py
导入。它只设置了三个变量:
from .sub_module import *
当程序运行时
x = y = z = 0
您可以看到,package\sub_module.py
中的名称通过包名称空间导入主模块的名称空间
因为包可以具有递归结构,所以可以使用两点表示包含包上方的包,三点表示包含该包的包,依此类推。但是,如果您需要超过三个点,您可能需要考虑重构:-)
这个系统是在中设计和记录的。import module\u name似乎不起作用,如果我从init.py调用import SomeModule,它会给出一个错误,那么第二个显式相对形式呢?刚刚尝试了第二个,效果很好。多谢各位
airhead:tmp sholden$ python main.py
['__builtins__',
'__doc__',
'__file__',
'__name__',
'__package__',
'pprint',
'sub_package',
'x',
'y',
'z']