【问题标题】:Import all modules in a package programatically以编程方式导入包中的所有模块
【发布时间】:2021-03-10 19:41:40
【问题描述】:

我有以下结构:

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

在我的code.py,我想导入整个PACKAGE文件夹:

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'

我想知道为什么?到目前为止,我阅读了几次尝试来实现我想做的事情,但都没有奏效。这里的这个似乎对我来说是最有希望的,但我不工作。

我在这里没有看到什么?

此外,当它出现在 cmets 中时,from PACKAGE import * 可以解决问题,但我想保留导入正确包的导入形式,例如 import PACKAGE

【问题讨论】:

  • 调用 importlib.import_module() 不会将任何名称带入您的范围,因此如果您的想法是“神奇地”能够使用来自 mod1mod2 的任何名称,这不是这样做。
  • 但我什至没有达到这一点。导入过程中发生错误 - os.listdir(os.path.dirname(__file__)) 列出了数组中的所有模块,然后循环并应一个接一个地导入
  • 您是否收到import PACKAGE 的错误?您可能想放弃 init.py 代码,只需将 code.py 中的 import 语句更新为 import PACKAGE *。如果我错过了重点,请详细说明。
  • 是的,我是,尝试import PACKAGE * 会给我一个invalid synthax error(另外,我更愿意在没有* 的情况下这样做
  • 当你调用你的模块时,你用 PACKAGE.mode 调用它们吗?

标签: python


【解决方案1】:

您必须将包名称 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)文件,并将它们作为all变量放入init.py

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')]

【讨论】:

  • 太棒了,这行得通!谢谢!您能否将__import__ 改回importlib.import_module,因为python 文档声明第一个通常不适合使用。稍后也会让其他一些读者感到困惑:)
猜你喜欢
  • 1970-01-01
  • 2014-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多