对不起,如果标题令人困惑,我会尝试通过更详细的说明来解释这个问题。
目前,我有一个包名,让我们说DummyPackage。 DummyPackage包含三个带有函数,类等的模块。因此目录结构如下所示:
project_dir/
__init__.py
DummyPackage/
__init__.py
Module1/
__init__.py
module_x.py
module_y.py
Module2/
__init__.py
module_z.py
因此,从模块导入方法如下所示
from DummyPackage.Module1.module_x import method_x
我们正在为项目添加新东西,我想创建一个名为DummyProject的模块,该模块应该像这样导入
from DummyProject import new_method
我假设,只添加文件DummyPackage.py就够了,但显然,它不是。我试图将它添加到project_dir / dir和DummyPackage / dir,但都不起作用。
是因为姓名冲突吗?是否可以拥有这样的代码?
import DummyPackage
from DummyPackage.Module1.module_x import method_x
DummyPackage.new_method
method_x
非常感谢你的帮助。
答案 0 :(得分:0)
将我的三条评论写在答案中:
首先让我使用您已有的模块解释relative imports,如果您想从module_x
导入module_y
,您可以这样做:
module_y.py
from .module_x import method_x
或类似于module_z.py
from ..Module1.module_x import method_x
因此,根据您在Intra-package References包中的DummyProject
的位置,可能就是您所需要的。
至于第二部分是的,可以使用(runnable)代码:
import DummyPackage
from DummyPackage.Module1.module_x import method_x
DummyPackage.new_method
method_x
在这种情况下,您希望new_method
成为包级变量。引用this great answer:
除了将目录标记为Python包并定义
__all__
之外,__init__.py
还允许您在包级别定义任何变量。
如果您想要一个真实的示例,我强烈建议您查看标准库中json/__init__.py
的源代码。
或者作为一个示例,您的设置可以直接从包中导入method_x
,您只需将其添加到顶级__init__.py
:
from .Module1.module_x import method_x
然后从导入包的任何文件中执行此操作:
import DummyPackage
DummyPackage.method_x
(虽然很明显你会根据new_method
的位置DummyProject
来做{/ 1>}