Python 以编程方式导入包中的所有模块

Python 以编程方式导入包中的所有模块,python,Python,我的结构如下: PACKAGE/ __init__.py mod1.py mod2.py ... code.py 在mycode.py中,我想导入整个软件包文件夹: import PACKAGE # execute some functions from mod1, mod2 or ... here. 为了确保动态导入,我在\uuuu init\uuuu.py中使用了以下代码: import os import importlib for module in

我的结构如下:

PACKAGE/
    __init__.py
    mod1.py
    mod2.py
    ...
code.py
在my
code.py
中,我想导入整个软件包文件夹:

import PACKAGE

# execute some functions from mod1, mod2 or ... here.
为了确保动态导入,我在
\uuuu init\uuuu.py
中使用了以下代码:

import os
import importlib
for module in os.listdir(os.path.dirname(__file__)):
    if module == '__init__.py' or module[-3:] != '.py':
        continue
    importlib.import_module(module[:-3], package='PACKAGE')
del module
但是,执行
code.py
会导致
ModuleNotFoundError:没有名为'mod1'的模块

我想知道为什么?到现在为止,我读了几篇试图实现我想做的事情的文章,但都没有成功。这个对我来说似乎是最有前途的,但我不工作

我在这里看不到什么


另外,正如在评论中提到的,
from PACKAGE import*
可以做到这一点,但我想保留导入适当包的导入形式,如
import PACKAGE

您必须将包名ate附加到模块字符串的开头,这样才能工作,否则它将给出一个名为ImportError的
无模块

import os
import importlib
for module in os.listdir(os.path.dirname(__file__)):
    if module == '__init__.py' or module[-3:] != '.py':
        continue
    __import__(__name__+'.'+module[:-3], locals(), globals())
del module
 
您可以使用importlib

import os
import importlib

for module in os.listdir(os.path.dirname(__file__)):
    if module == '__init__.py' or module[-3:] != '.py':
        continue
    importlib.import_module("."+module[:-3], __name__ )    
del module
最好的方法是列出当前文件夹中的所有python(.py)文件,并将它们作为init.py中的all变量

from os.path import dirname, basename, isfile, join
import glob
modules = glob.glob(join(dirname(__file__), "*.py"))
__all__ = [ basename(f)[:-3] for f in modules if isfile(f) and not f.endswith('__init__.py')]

调用
importlib.import_module()
不会将任何名称带入您的范围,因此,如果您的想法是“神奇地”能够使用
mod1
mod2
中的任何名称,这不是实现这一点的方法。但我甚至没有说到这一点。该错误发生在导入过程中,并且
os.listdir(os.path.dirname(\uuuu file\uuuu))
列出了数组中的所有模块,然后该数组被循环,应该一个接一个地导入。您在
导入包时是否收到错误?您可能希望放弃init.py代码,只需将code.py中的import语句更新为
import-PACKAGE*
。如果我没有抓住要点,请详细说明。是的,我是,尝试
import PACKAGE*
会给我一个
无效的synthax错误
(另外,我更愿意在调用模块时不使用
*
而使用PACKAGE.mode来调用它们吗?太棒了,可以了!谢谢!请您将
\uuuuuuuuuuuuuuuuuuu
更改回
importlib.import\u模块
,因为python文档声明一般不使用第一个模块。这也会让人困惑。)其他一些读者后来说:)我更新了我的答案,希望这能有所帮助