问题
我发现Python的导入过程在一种情况下很棒,但在另一种情况下往往会完全失败。我遇到的情况是我正在创建一个可以作为模块运行或安装的程序。它以一种方式(作为模块)工作,而不以另一种方式(已安装)工作。取决于我的导入方式。我不知道该如何解决。
注意:该程序只能在Python 3上运行。
问题示例
以下是显示该问题的代码库:https://github.com/jeffnyman/pacumen
如果克隆了该副本,则可以在项目根目录中运行以下命令:
python3 -m pacumen
它很好用。
现在,我要安装它。因此,从项目根目录开始:
pip3 install .
那行得通(通过我的setup.py),但是您应该能够像这样运行程序:
pacumen
程序运行,但出现此错误:
Traceback (most recent call last):
File "/usr/local/bin/pacumen", line 7, in <module>
from pacumen.__main__ import main
File "/usr/local/lib/python3.7/site-packages/pacumen/__main__.py", line 5, in <module>
from .mechanics import layout
ModuleNotFoundError: No module named 'pacumen.mechanics'
显然是由于my import statement。
但是目前尚不清楚我可以做什么来解决此问题。我发现大多数Python文档对解决导入问题都毫无帮助,因为它告诉我的内容仅在一种情况下有效,而在另一种情况下无效。我无疑会丢失一些东西。
我尝试过的事情
我尝试将以下行添加到我的__init__.py
:
from .__main__ import *
这是对其他问题的其他评论。但是,这不起作用。会产生相同的错误。
我尝试将__main__.py
中的导入内容更改为:
from pacumen.mechanics import layout
这也是另一个问题的建议。那也行不通。同样的错误。
我的导入绝对不会出错,因为它可以作为模块运行。因此,我不确定我的设置是否完成不正确,或者我是否需要在__init__.py
中进行其他操作,或者我实际上想执行的操作不是您应该执行的操作。
答案 0 :(得分:0)
当然,我想我在发布上述内容后找到了答案。我不确定这是否正确,但它似乎可以正常工作,因此,如果有人遇到此问题,我将把它记录为答案。
我要做的是将以下内容添加到我的setup.py中:
packages=['pacumen', 'pacumen.mechanics'],
以前我只有这个:
packages=['pacumen'],
对于创建的每个目录,我显然都必须这样做。