Python3相对导入包失败

时间:2017-12-19 10:01:38

标签: python python-3.x

我一直在阅读与此事有关的大量问题,但迄今为止没有一个问题对我有所帮助。我目前正在使用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

UPDATE :修改上一个命令中的语法错误,同时调用python -m myproject给我一个ModuleNotFoundError因为一个模块不是我的责任,这基本上是项目中使用的库。

3 个答案:

答案 0 :(得分:3)

正确的语法是

python -m myproject

这应该在顶级包中执行__main__

答案 1 :(得分: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将包添加到路径中:
  3. # setup.py
    from setuptools import setup, find_packages
    
    setup(
        name='sample',
        packages=find_packages()
    )
    

答案 2 :(得分:1)

你需要在每个子文件夹中使用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文件可以为空,但需要存在于子文件夹中才能导入该模块/包