如何解决Catch 22 ModuleNotFoundError:ImportError:如果我修复一个,我会得到另一个
我有一个 Python 项目,我正尝试为 PyPI 打包该项目,但是当我使用 setup.py 时,它停止作为独立脚本工作。
目录结构如下:
project_dir
setup.py
module_name_dir
__init__.py
main.py
other.py
init.py 从 main.py 导出选定的方法。 main.py 从 other.py 导入各种东西
当我在 main.py 中编写导入时
from other import *
然后 $ python main.py
运行良好但 $ python setup.py sdist
给出“ModuleNotFoundError: No module named 'other'”
另一方面,当我像这样编写导入时
from .other import *
然后 $ python setup.py sdist
运行良好,但 $ python main.py
给出“ImportError:在没有已知父包的情况下尝试相对导入
"
setup.py 脚本非常简单,接近最小的例子:
from setuptools import setup
description=""" ... """
long_description=""" ... """
setup(
name="",version="",packages=[module_name],url="",license='MIT',author="",author_email="",description=description,long_description=long_description,long_description_content_type='text/markdown',keywords='',classifiers=[
'Development Status :: 3 - Alpha','Intended Audience :: Developers','Topic :: System :: Networking','License :: OSI Approved :: MIT License','Programming Language :: Python :: 3'
],)
我认为这种明显的 catch 22 情况是因为我的圆顶有些错误,而不是实际应该的方式。谁能帮我修一下?
解决方法
实际上,您尝试为同一个文件使用不同的模块名称。 这行不通。
您要创建一个包:
文件module_name_dir/main.py
的模块名称是module_name_dir.main
如果您想单独调用脚本,例如可以键入:
python -m module_name_dir.main
但是你不能(不应该)用
python module_name_dir/main.py
你不应该 cd 到 module_name_dir
并用 python main.py
关于入口点:
这完全是可选的,但我认为知道它可能会很好:
但是你可以做的是:
在 setup.py 中添加一个条目。
例如:
entry_points={
'console_scripts': [
'mycmd = module_name_dir.main:main',]
},
这里假设 module_name_dir/main.py
包含一个名为 main
的函数
如果您使用 virtualenvs(推荐用于开发 python 包),您可以出于测试目的输入
pip install -e .
然后你可以输入 mycmd 来启动你的脚本
,您必须更新 setup.py 文件:
from setuptools import *
description=""" ... """
long_description=""" ... """
setup(
name="",version="",packages=[module_name],url="",license='MIT',author="",author_email="",description=description,long_description=long_description,long_description_content_type='text/markdown',packages = find_packages(),keywords='',classifiers=[
'Development Status :: 3 - Alpha','Intended Audience :: Developers','Topic :: System :: Networking','License :: OSI Approved :: MIT License','Programming Language :: Python :: 3'
],)
find_packages()
函数将添加所有外部模块以及主 .py 文件,如果它是 CLI,那么正如@KlausF 所说,您必须包含一个入口点
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。