Python3 相对导入在包中失败

新手上路,请多包涵

我一直在阅读与此事相关的大量问题,但到目前为止,没有一个对我有帮助。我目前正在使用 Python click 库将脚本作为命令执行。

我正在尝试执行的当前命令被放置在一个 Python 包中,它有一个 __main__.py 文件,就像父目录一样。当前的项目结构如下。

 /myproject
   /foo_one
       __init__.py
       foo_one.py
    /foo_two
       __init__.py
       foo_two.py
    /foo_three
       __init__.py
       foo_three.py
    /foo_four
       __init__.py
       foo_four.py
    /foo_five
       __init__.py
       foo_five.py
    /foo_six
       __init__.py
       foo_six.py
    __init__.py
    __main__.py
    foo_seven.py

每当我尝试运行位于项目文件夹中的 __main__.py 脚本时,都会出现以下错误。

ModuleNotFoundError: No module named '__main__.foo_two'; '__main__' is not a package

但是,如果我尝试使用 -m 选项从上面的文件夹执行相同的脚本 python3 myproject -m ,将显示以下内容。

ImportError: attempted relative import with no known parent package

__main__.py 有 2 个这样的导入… __init__.py 是空的。

 from .foo_two.foo_two import AClass, AnotherClass, OtherClass
from .foo_three.foo_three import AnotherClassMore

更新:更正上一个命令中的语法错误,同时调用 python -m myproject 给我一个 ModuleNotFoundError 因为一个模块不是我的责任,它基本上是一个库,用于该项目。

原文由 Lenny D. 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 586
2 个回答

希望这对外面的人有价值——我浏览了六个 stackoverflow 帖子,试图找出与上面发布的内容类似的相对导入。我按照建议设置了所有内容,但我仍在点击 ModuleNotFoundError: No module named 'my_module_name'

因为我只是在本地开发和玩耍,所以我没有创建/运行 setup.py 文件。我也显然没有设置我的 PYTHONPATH

我意识到当我像以前一样运行我的代码时,当测试与模块位于同一目录时,我找不到我的模块:

 $ python3 test/my_module/module_test.py                                                                                                               2.4.0
Traceback (most recent call last):
  File "test/my_module/module_test.py", line 6, in <module>
    from my_module.module import *
ModuleNotFoundError: No module named 'my_module'

但是,当我明确指定路径时,事情开始起作用:

 $ PYTHONPATH=. python3 test/my_module/module_test.py                                                                                                  2.4.0
...........
----------------------------------------------------------------------
Ran 11 tests in 0.001s

OK

因此,如果有人尝试了一些建议,认为他们的代码结构正确并且仍然发现自己处于与我相似的情况,请尝试以下任一方法,如果您不只是将导出当前目录添加到您的 PYTHONPATH:

  1. 运行您的代码并明确包含如下路径: $ PYTHONPATH=. python3 test/my_module/module_test.py
  2. 为了避免调用 PYTHONPATH=. ,创建一个 setup.py 包含如下内容的文件并运行 python setup.py development 以将包添加到路径:
 # setup.py
from setuptools import setup, find_packages

setup(
    name='sample',
    packages=find_packages()
)

原文由 LaCroixed 发布,翻译遵循 CC BY-SA 3.0 许可协议

正确的语法是

python -m myproject

这应该在顶层包中执行 __main__

原文由 Omni 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题