Docker容器中自定义Python模块无法找到(含setup.py与entry_points)
容器化Python项目遇ModuleNotFoundError问题及解决
项目结构
|--Dockerfile |--requirements.txt |--setup.py |--mydummyproject |--|--__init__.py |--|--__main__.py |--|--dummy.py
各文件内容
dummy.py
包含简单打印函数:
import numpy as np def return_output(*args): for a in args: print(f"Hello {a}") print("Phew!") print("We've got numpy:",np.__version__)
init.py
仅为形式文件,无实际代码。
main.py
实现基础命令行参数解析接口:
import argparse from .dummy import return_output def command_line_target(): parser = argparse.ArgumentParser() parser.add_argument('-v','--value', nargs='+',default=["John","Jane"]) args = parser.parse_args() return_output(*args.value)
原setup.py配置
from setuptools import setup with open("requirements.txt", "r") as _f: install_reqs = _f.read().strip().split("\n") setup(name="dummy", version="0.0.1", package_dir={"mydummyproject": "mydummyproject"}, install_requires=install_reqs, python_requires=">=3.8", entry_points={ 'console_scripts': [ 'hello = mydummyproject.__main__:command_line_target' ]} )
问题描述
该项目在本地conda测试环境中可正常运行,但通过WSL和Docker Desktop完成容器化后,执行docker run dummytest时抛出ModuleNotFoundError: No module named 'mydummyproject'错误。期间尝试修改Dockerfile、目录名及setup.py相关配置,均未解决问题。
解决方法
最终通过在setup.py中使用find_packages()替代原有的package_dir配置,成功解决模块找不到的问题。修改后的setup.py如下:
from setuptools import setup, find_packages with open("requirements.txt", "r") as _f: install_reqs = _f.read().strip().split("\n") setup(name="dummy", version="0.0.1", packages=find_packages(), install_requires=install_reqs, python_requires=">=3.8", entry_points={ 'console_scripts': [ 'hello = mydummyproject.__main__:command_line_target' ]} )
原因说明
原package_dir配置在本地环境中能被setuptools正确识别,但容器化环境下可能存在路径解析差异,导致包未被正确安装到Python环境中。find_packages()会自动递归查找当前目录下所有包含__init__.py的Python包,确保包被完整安装,从而解决模块缺失问题。
内容的提问来源于stack exchange,提问作者ivan199415
相关产品推荐
相关产品推荐

