Python3相对导入在packag中失败

2024-05-20 02:31:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我读了很多关于这件事的问题,但到目前为止没有一个能帮到我。我目前正在使用Pythonclick库作为命令执行脚本。

我试图执行的当前命令被放在一个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有两个这样的导入。。。__init__.py为空。

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

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


Tags: 项目pyimport命令脚本fooinitmain
1条回答
网友
1楼 · 发布于 2024-05-20 02:31:25

正确的语法是

python -m myproject

这应该在顶级包中执行__main__

网友
2楼 · 发布于 2024-05-20 02:31:25

您需要在每个带有python代码的子文件夹中都有__init__.py,以告诉解释器将该文件夹视为一个模块

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

__init__.py告诉解释器将子文件夹视为python模块/包,您应该能够导入

__init__.py文件可以为空,但需要存在于子文件夹中才能导入该模块/包

网友
3楼 · 发布于 2024-05-20 02:31:25

希望,这将是有价值的人在那里-我通过半打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()
)

相关问题 更多 >