首页 > 解决方案 > 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 情况是因为我做了一些错误的事情,而不是它实际上应该是的方式。任何人都可以帮我解决它吗?

标签: pythonsetuptoolspython-3.8setup.py

解决方案


实际上,您尝试对同一个文件使用不同的模块名称。这行不通。

你想创建一个包:

该文件的模块名称module_name_dir/main.pymodule_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 来启动你的脚本


推荐阅读