Python 以相对导入作为_主项运行模块__

Python 以相对导入作为_主项运行模块__,python,python-3.x,Python,Python 3.x,我的文件结构如下: - __init__.py - module.py + subpackage |--- __init__.py |--- submodule1.py |--- submodule2.py |--- etc submodule1.py从submodule2.py导入 从submodule1.py导入模块 为此,我使用相对导入。例如,在submodule1.py中: from .submodule2 import MyClass 我遇到的问题是,现在使用相对导入,我无法将

我的文件结构如下:

- __init__.py
- module.py
+ subpackage
|--- __init__.py
|--- submodule1.py
|--- submodule2.py
|--- etc
  • submodule1.py从submodule2.py导入
  • 从submodule1.py导入模块
为此,我使用相对导入。例如,在submodule1.py中:

from .submodule2 import MyClass
我遇到的问题是,现在使用相对导入,我无法将submodule1.py作为main运行。如果我尝试,会出现以下错误:

    from .module2 import MyClass
    ModuleNotFoundError: No module named '__main__.module2'; '__main__' is not a package
我喜欢在我的模块末尾添加一个
如果uuuu name_uuu==“uuuu main_uuuu”:
,以便在开发过程中进行测试(在某些情况下,模块甚至可以用作独立脚本)


有没有办法在这张照片上“吃我的蛋糕,也吃它”?或者我最好的办法是将代码从
迁移到一个单独的脚本,而不是作为包的成员运行模块,就好像它们是独立的脚本一样。在包中运行模块时,需要让Python知道模块在包结构中的位置。这是通过使用调用Python解释器来实现的。比如说,不是写作

python3 ./my_package/subpackage/submodule1.py


这将使解释器能够适当地确定包的结构,并解析您使用的任何相对导入。有关更多信息,请参阅关于
-m
标志的使用。

使用绝对导入。您如何运行代码?您是否将“主”文件视为脚本(即
python module.py
)或包(即
python-m my_package.module
)?感谢您的详细回答!这很有道理。我一直在寻找一种方法,将模块的功能保留为独立于包结构的脚本,但老实说,您让我意识到这不是很有价值。如果有人想从软件包中删除模块,只需更改导入就不难了。
python3 -m my_package.subpackage.submodule1