使用setup.py构建的命令行工具出现Python ModuleNotFoundError

0 投票
0 回答
27 浏览
提问于 2025-04-11 23:15

我正在尝试制作一个简单的命令行工具,并用 setup.py 来打包它。以下是我的文件夹结构。

├── s3_md5
│   ├── __init__.py
│   ├── cmd.py
│   └── src
│       ├── __init__.py
│       ├── cli.py
│       ├── logger.py
│       ├── s3_file.py
│       └── s3_md5.py
├── setup.py
└── test
    ├── __init__.py
    ├── conftest.py
    ├── test_calculate_range_bytes_from_part_number.py
    ├── test_get_file_size.py
    ├── test_get_range_bytes.py
    └── test_parse_file_md5.py

setup.py

'''installer'''
from os import getenv

from setuptools import find_packages, setup

setup(
    name="s3-md5",
    description="Get fast md5 hash from an s3 file",
    version=getenv('VERSION', '1.0.0'),
    url="https://github.com/sakibstark11/s3-md5-python",
    author="Sakib Alam",
    author_email="16sakib@gmail.com",
    license="MIT",
    install_requires=[
        "boto3==1.26.41",
        "boto3-stubs[s3]",
    ],
    extras_require={
        "develop": [
            "autopep8==2.0.1",
            "moto==4.0.12",
            "pytest==7.2.0",
            "pylint==3.1.0",
        ],
        "release": ["wheel==0.43.0"]
    },
    packages=find_packages(exclude=["test", "venv"]),
    python_requires=">=3.10.12",
    entry_points={
        'console_scripts': ['s3-md5=s3_md5.cmd:run'],
    }
)

还有 cmd.py

'''driver'''
from time import perf_counter

from boto3 import client
from src.cli import parse_args
from src.logger import logger
from src.s3_md5 import parse_file_md5


def run():
// some stuff with imports from src


if __name__ == "__main__":
    run()

当我直接从 s3_md5 文件夹运行 cmd.py 时,一切都很好。但是,当我把它打包并安装成命令行工具后再运行,就出现了问题

ModuleNotFoundError: No module named 'src'

我检查了 lib 文件夹,发现里面确实有 src 文件夹。奇怪的是,当我在 cmd.py 中使用 s3_md5.src.cli 时,命令行工具可以正常工作,但从目录直接运行脚本就不行了,因为它引用的是已安装的包,而不是代码本身,这在开发时会造成问题。我尝试阅读关于 Python 模块系统的所有资料,但还是搞不清楚。我怀疑是 PYTHONPATH 不知道去哪里找 src,但我也可能错了。我试过使用相对导入,这在命令行工具中有效,但直接运行 python cmd.py 时却提示没有已知的父级。

0 个回答

暂无回答

撰写回答