这个问题或近亲之前至少被问过三次(1、2、3),但我发现从来没有得到令人满意的回答;仅提供了解决方法,但它们都不适合我的特定用例。
假设目录结构如下:
mypackage/
├── __init__.py
└── mod.py
从 mod.py
我想导入 mypackage
。不是 mypackage
中定义的任何特定事物,也不是同级模块,而是您将获得的完全相同的对象
从包外部写入 import mypackage
。我想在不使用名称 mypackage
的情况下执行此操作(以防将来可能被重命名)。我该怎么做?
(您可以假设包含包不是 namespace 包。)
(您可能认为说 import __init__
会起作用,但这实际上会重新加载 __init__.py
并创建一个单独的模块对象, mypackage.__init__
,所以这不好。)
重申一下,这个问题之前迭代的答案仅提供了对我不起作用的解决方法(例如,相对地仅从包含包中导入您需要的内容,或者重组代码以避免需要引用包含包) 。 请不要建议任何替代方法。请准确回答我提出的问题。
最佳答案
您可以通过在
mod.py 中使用
.__package__
或__spec__.parent
以字符串形式获取包含包的名称参见:
您可以使用
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/