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

2024-05-15 02:15:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我的结构如下:

PACKAGE/
    __init__.py
    mod1.py
    mod2.py
    ...
code.py

在mycode.py中,我想导入整个包文件夹:

import PACKAGE

# execute some functions from mod1, mod2 or ... here.

为了确保动态导入,我在__init__.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: No module named 'mod1'

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

我在这里看不到什么

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


Tags: orfrompyimport文件夹packageinitos
1条回答
网友
1楼 · 发布于 2024-05-15 02:15:51

您必须将包名ate附加到模块字符串的开头,否则它会给出一个no module named <filename> 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')]

相关问题 更多 >

    热门问题