python-packaging - 学习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 中缺少命令?
如果有人能指出我正确的方向?
编辑:在开发将要打包的模块时,我是否需要做一些不同的事情,也许以不同的方式调用代码?
干杯
解决方案
在我看来,绝对进口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
.
推荐阅读
- mysql - 从nodejs调用存储过程返回错误
- javascript - JavaScript 加载资源失败:找不到文件,但该文件是 Laravel 自动生成的视图
- java - 如何在 Java 中为 0MQ ( ZeroMQ ) 设置超时?
- java - 如何以编程方式创建 kerberos 凭据缓存?
- sql - postgresql中的数据透视表
- html - 如何让 SceneView 地图显示在 div 容器中?
- nginx - nginx won't resolve hostname in K8S
- google-sheets - 将公式值返回到单元格并添加到谷歌表格中的现有数据
- php - Laravel 5.3 中的内存不足错误
- google-sheets - Google 表格通配符不适用于 COUNTIF