ChatGPT解决这个技术问题 Extra ChatGPT

如何使用 importlib.import_module 在 Python 中导入模块

我试图在 Python 2.7.2 中使用 importlib.import_module 并遇到奇怪的错误。

考虑以下目录结构:

a
    |
    + - __init__.py
      - b
        |
        + - __init__.py
          - c.py

a/b/__init__.py 具有以下代码:

import importlib

    mod = importlib.import_module("c")

(在实际代码中"c"有名称。)

尝试 import a.b 会产生以下错误:

>>> import a.b
    Traceback (most recent call last):
      File "", line 1, in 
      File "a/b/__init__.py", line 3, in 
        mod = importlib.import_module("c")
      File "/opt/Python-2.7.2/lib/python2.7/importlib/__init__.py", line 37, in   import_module
        __import__(name)
    ImportError: No module named c

我错过了什么?

谢谢!


C
Cat Plus Plus

对于相对进口,您必须:

a) 使用相对名称

b) 显式提供锚 importlib.import_module('.c', 'ab')

当然,你也可以只做绝对导入:

importlib.import_module('a.b.c')

这也适用于 python 3.x。 (OP询问了2.7。)
我可以像使用 import long_name as ln 一样重命名它吗?
您可以,只需为其指定一个名称,例如 abc = importlib.import_module('a.b.c')
我收到错误,因为我找不到一些不在 a 或 b 中但在 c 中导入的实用程序函数。我该如何解决?
G
Gerald

我认为最好使用 importlib.import_module('.c', __name__),因为您不需要了解 ab

我还想知道,如果必须使用 importlib.import_module('a.b.c'),为什么不直接使用 import a.b.c


当模块名称是一个变量时它很有用。
当模块名称不是有效的 python 标识符(例如,其中有破折号)时,它也很有用。
H
H.Sechier

并且不要忘记为每个文件夹/子文件夹创建一个 __init__.py(即使它们是空的)


为什么呢?我发现这个:stackoverflow.com/questions/448271/what-is-init-py-for#448279 @TwoBItAlchemist 的评论最有用,我认为“”“Python 搜索目录列表以解析名称,例如 import 语句。因为这些可以是任何目录,并且可以添加任意目录对于最终用户,开发人员不得不担心目录碰巧与有效的 Python 模块共享名称,例如 docs 示例中的 'string'。为了缓解这种情况,它会忽略不包含名为 _ 的文件的目录init _ _.py(没有空格),即使它是空白的。"""