作为模块和已安装程序运行时,如何编写Python 3 Import语句?

时间:2019-01-08 20:32:29

标签: python-3.x python-import

问题

我发现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中进行其他操作,或者我实际上想执行的操作不是您应该执行的操作。

1 个答案:

答案 0 :(得分:0)

当然,我想我在发布上述内容后找到了答案。我不确定这是否正确,但它似乎可以正常工作,因此,如果有人遇到此问题,我将把它记录为答案。

我要做的是将以下内容添加到我的setup.py中:

packages=['pacumen', 'pacumen.mechanics'],

以前我只有这个:

packages=['pacumen'],

对于创建的每个目录,我显然都必须这样做。