Python3相对导入在包中失败

Python3相对导入在包中失败,python,python-3.x,Python,Python 3.x,我读了很多关于这件事的问题,但到目前为止,并没有一个对我有帮助。我目前正在使用Pythonclick库以命令的形式执行脚本 我试图执行的当前命令被放置在一个Python包中,该包有一个\uuuu main\uuuuu.py文件,就像父目录一样。目前的项目结构如下 /myproject /foo_one __init__.py foo_one.py /foo_two __init__.py foo_two.py /foo

我读了很多关于这件事的问题,但到目前为止,并没有一个对我有帮助。我目前正在使用Python
click
库以命令的形式执行脚本

我试图执行的当前命令被放置在一个Python包中,该包有一个
\uuuu main\uuuuu.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
每当我试图运行项目文件夹中的
\uuuuu main\uuuuuu.py
脚本时,就会出现以下错误

ModuleNotFoundError:没有名为“\uuuu main\uuuu.foo\uu two”的模块__main__u;不是一个包

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

ImportError:尝试在没有已知父包的情况下进行相对导入

\uuuuu main\uuuuu.py
有两个类似的导入。。。
\uuuu init\uuuu.py
为空

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

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

您需要在每个子文件夹中使用python代码设置
\uuu init\uuu.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
\uuuu init\uuuuu.py
告诉解释器将子文件夹视为python模块/包,您应该能够导入


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

python -m myproject

这应该在顶级包中执行
\uuuuuu main\uuuuu

希望这对其他人有价值——我浏览了半打stackoverflow帖子,试图找出与上面帖子类似的相对进口。我按照建议设置了所有内容,但仍然点击了
modulenofounderror:没有名为'my\u module\u 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,请尝试以下任一方法:

  • 运行代码并显式包含如下路径:
    $PYTHONPATH=。python3测试/my_模块/module_测试.py
  • 要避免调用
    PYTHONPATH=。
    ,请创建一个包含以下内容的
    setup.py
    文件,然后运行
    python setup.py development
    将包添加到路径:

  • 完全忘了添加这些内容,因为它们会自动包含在内。。。我已经有了,问题已经更新了。对不起,谢谢你的更正。如果我像这样执行代码,则会针对一个模块抛出一个异常,但该模块是项目中的库。检查可能重复。
    $ PYTHONPATH=. python3 test/my_module/module_test.py                                                                                                  2.4.0
    ...........
    ----------------------------------------------------------------------
    Ran 11 tests in 0.001s
    
    OK
    
    # setup.py
    from setuptools import setup, find_packages
    
    setup(
        name='sample',
        packages=find_packages()
    )