You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python自定义包执行时出现ModuleNotFoundError的解决方法求助

解决Python包子模块导入失败问题

问题原因

  1. 导入路径错误:__main__.py中直接使用from package_a import ...属于顶级模块查找,但package_a是ds包的子模块,Python无法在全局命名空间定位到它。
  2. 打包配置遗漏子包:setup.py仅指定packages=["ds"],setuptools只会打包ds根目录,不会自动包含其下的package_a子包和settings.py模块。

解决方案

1. 修正ds/__main__.py的导入语句

有两种可行方式:

方式一:使用绝对导入(推荐)

修改导入代码为带包前缀的绝对路径:

from ds.package_a import name_a
from ds.package_a.package_a_b import name_a_b
from ds.settings import config

def main():
    print(name_a)
    print(config)    

方式二:使用相对导入

利用相对路径(.表示当前包目录)导入子模块:

from .package_a import name_a
from .package_a.package_a_b import name_a_b
from .settings import config

def main():
    print(name_a)
    print(config)    

2. 修正setup.py的打包配置

需要让setuptools识别并打包所有子包,有两种方式:

方式一:自动发现所有包(推荐)

导入find_packages工具,自动扫描并包含所有子包:

import pathlib
from setuptools import setup, find_packages  # 新增导入find_packages

HERE = pathlib.Path(__file__).parent

README = (HERE / "README.md").read_text()

setup(
    name="ds",
    version="2.0.0",
    long_description=README,
    long_description_content_type="text/markdown",
    license="MIT",
    classifiers=[
        "License :: OSI Approved :: MIT License",
        "Programming Language :: Python :: 3",
        "Programming Language :: Python :: 3.8",
    ],
    packages=find_packages(),  # 替换原packages配置
    include_package_data=True,
    entry_points={
        "console_scripts": [
            "ds=ds.__main__:main",
        ]
    },
)

方式二:手动列出所有包

如果不想使用自动发现,可手动列出所有需要打包的包:

# ... 其他代码不变
packages=["ds", "ds.package_a", "ds.package_a.package_a_b"],
# ... 其他代码不变

3. 重新安装并验证

执行以下命令重新打包安装:

rm -rf dist
pip uninstall ds -y
python setup.py bdist_wheel
pip install dist/ds-2.0.0-py3-none-any.whl --force-reinstall
ds

此时执行ds命令即可正常输出name_a和config的内容。

内容的提问来源于stack exchange,提问作者Tlaloc-ES

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 07:10:59