Catch 22 ModuleNotFoundError: ImportError: If I fix one I get the other
Catch 22 ModuleNotFoundError: ImportError: If I fix one I get the other
我有一个 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:没有名为 'other' 的模块”
另一方面,当我像这样编写导入时
from .other import *
然后 $ python setup.py sdist
运行正常,但 $ python main.py
给出“ImportError: attempted relative import with no known parent package
“
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'
],
)
我认为这种明显的第 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 所说,您必须包含一个入口点
我有一个 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:没有名为 'other' 的模块”
另一方面,当我像这样编写导入时
from .other import *
然后 $ python setup.py sdist
运行正常,但 $ python main.py
给出“ImportError: attempted relative import with no known parent package
“
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'
],
)
我认为这种明显的第 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 所说,您必须包含一个入口点