Python:导入包含包的实际模块对象,而不命名它

标签 python python-3.x

这个问题或近亲之前至少被问过三次(123),但我发现从来没有得到令人满意的回答;仅提供了解决方法,但它们都不适合我的特定用例。

假设目录结构如下:

mypackage/
├── __init__.py
└── mod.py

mod.py 我想导入 mypackage。不是 mypackage 中定义的任何特定事物,也不是同级模块,而是您将获得的完全相同的对象 从包外部写入 import mypackage 。我想在不使用名称 mypackage 的情况下执行此操作(以防将来可能被重命名)。我该怎么做?

(您可以假设包含包不是 namespace 包。)

(您可能认为说 import __init__ 会起作用,但这实际上会重新加载 __init__.py 并创建一个单独的模块对象, mypackage.__init__,所以这不好。)

重申一下,这个问题之前迭代的答案仅提供了对我不起作用的解决方法(例如,相对地仅从包含包中导入您需要的内容,或者重组代码以避免需要引用包含包) 。 请不要建议任何替代方法。请准确回答我提出的问题。

最佳答案

  1. 您可以通过在 mod.py 中使用 __package____spec__.parent 以字符串形式获取包含包的名称.

    参见:

  2. 您可以使用 importlib.import_module 导入以字符串形式指定名称的包。 .

演示:

__init__.py

x = 5

mod.py

import importlib

p = importlib.import_module(__package__)
print(p)
print(p.x)
$ tree
.
└── mypackage
    ├── __init__.py
    └── mod.py

$ python3 -c 'import mypackage.mod'
<module 'mypackage' from '/tmp/…/mypackage/__init__.py'>
5

关于Python:导入包含包的实际模块对象,而不命名它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77261423/

相关文章:

python - 调整 turtle 屏幕大小和保存时出现问题

Python 算法效率

python - 使用 Python 查找远程主机操作系统的有效方法

Python3-= x 的 3 个变量的所有可能组合

python - 如何在 python 中将列表的元素分配为文件名?

python - asyncio create_connection 协议(protocol)工厂

python-3.x - 凭证文件的 boto3 格式和位置

python - 为 Pandas 数据框中满足条件的列打印特定列(代码有效,只需帮助将其减少为一行代码)

python - 为什么使用 asyncio Server 作为上下文管理器 * 并且 * 调用 serve_forever()?

python - ORtools 安排学生上课时间冲突