python - 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:没有名为'其他'的模块”
另一方面,当我编写导入时
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 tomodule_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 来启动你的脚本
推荐阅读
- javascript - 如何获取csv文件的每一行
- javascript - 我的数组没有将图片加载到 html
- delphi - “字节”和“字节”有什么区别?
- elasticsearch - 如何访问安装在 GCP Compute Engine 实例上的 Elastic Search?
- tensorflow - 声明嵌入层时出现 ResourceExhaustedError (Keras)
- cortex-m - 如何将四个 Cortex M0 物理地址映射到单个数组以进行位碰撞?
- html - 响应式嵌入基础 6
- image - astropy Cutout2D 图像图中的坐标不均匀
- tensorflow - Keras 的半监督训练
- node.js - 如何使用 node.js 将 JSON 解析为模型