Setuptools打包后安装路径分散,如何统一到项目目录下
解决方案
这不是Python的默认行为,是你的setup.py配置和项目结构导致的,调整后可以实现将所有文件统一放到site-packages/my_project_name/目录下,具体步骤如下:
1. 调整项目目录结构
把main.py和generated目录都放到一个名为my_project_name的顶层包目录中,同时确保该目录和generated子目录下都存在__init__.py文件(空文件即可,用于标识这是Python包)。最终结构如下:
my_project_name/ ├── setup.py └── my_project_name/ ├── __init__.py ├── main.py └── generated/ ├── __init__.py └── (你的generated模块文件)
2. 修改setup.py配置
移除原配置中的py_modules参数,改用setuptools.find_packages()自动识别所有包结构,修改后的代码如下:
from setuptools import setup, find_packages setup( name='my_project_name', version='0.0.1', description='My project', packages=find_packages(), python_requires='>=3.5', install_requires=[ 'requests>=2.20.0', 'grpcio>=1.48.2', 'grpcio-tools>=1.48.2' ], )
3. 重新打包安装
执行以下命令重新生成包并安装:
python setup.py sdist pip install dist/my_project_name-0.0.1.tar.gz
原因说明
- 原配置中
py_modules=['main']会把main.py作为独立单文件模块直接安装到site-packages根目录; packages=['generated']会把generated作为独立顶层包安装到site-packages根目录;- 调整后的结构将
main.py和generated都作为my_project_name包的子模块/子包,find_packages()会自动识别整个包结构,安装后所有文件都会被放到site-packages/my_project_name/目录下。
如果generated目录是通过grpc工具自动生成的,可手动添加空的__init__.py文件,或者在生成脚本中配置自动生成该文件,确保setuptools能识别它为合法的Python包。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

