首页 > 解决方案 > 学习python打包,老ModuleNotFoundErrro

问题描述

我在这里做错了什么???

我的结构:-

├── tst
│   ├── setup.py
│   └── tst
│       ├── __init__.py
│       ├── mre.py
│       └── start.py

start.py 的内容

from mre import mre


def proc1():
    mre.more()
    return ('ran proc1')


if __name__ == "__main__":
    print('test')
    print(proc1())

mre.py 的内容

class mre(object):

    def more():
        print('this is some more')

setup.py 的内容

from setuptools import setup

setup(name='tst',
      version='0.1',
      description='just a test',
      author='Mr Test',
      author_email='test@example.com',
      entry_points={'console_scripts': ['tst=tst.start:proc1']},
      license='MIT',
      packages=['tst'],
      zip_safe=False)

什么都没有__init__.py

当我从命令行运行它时,一切都很好,按预期运行。但是,当我使用 PIP 将其打包并使用 tst 运行时,我得到:-

Traceback (most recent call last):
  File "/home/simon/.local/bin/tst", line 5, in <module>
    from tst.start import proc1
  File "/home/simon/.local/lib/python3.8/site-packages/tst/start.py", line 1, in <module>
    from mre import mre
ModuleNotFoundError: No module named 'mre'

我已经阅读了很多帖子,如果我进入已安装的代码并更改行,我似乎无法弄清楚这一点

from mre import mre

from tst.mre import mre

然后它可以工作,但是当出于开发目的从 dir 运行它时,这不起作用...我显然缺少一些明显的东西:) 是路径问题还是我在 setup.py 中缺少命令?

如果有人能指出我正确的方向?

编辑:在开发将要打包的模块时,我是否需要做一些不同的事情,也许以不同的方式调用代码?

干杯

标签: python-packaging

解决方案


在我看来,绝对进口from tst.mre import mre是正确的。您最终可以使用from .mre import mre,但绝对导入更安全。

出于开发目的:

  • 使用pip可编辑模式
    • path/to/pythonX.Y -m pip install --editable .
    • 类似于setuptools 开发模式,它正在慢慢走向弃用path/to/pythonX.Y setup.py develop
  • 并运行控制台脚本或可执行模块:
    • tst
    • path/to/pythonX.Y -m tst.start

无需安装,通常可以运行可执行模块

  • path/to/pythonX.Y -m tst.start.

推荐阅读