Python包导入自己的文件,编译时不知道包名

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

我的python应用程序动态加载包,加载Datatypes目录中的每个包,如果字符串模块(init.py)想要导入SomeModule.py,它必须使用app.py(正在执行的文件)中的路径进行导入 例如

我希望有一种导入相关模块的方法,而不必知道包的名称(目录名) 例如


这可能吗?如果是这样,我将如何实现这一点

如果您不知道路径,请使用
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']