技术咨询:Python项目安装文件全部署至lib并保留入口点功能
如何调整Python项目配置,将安装相关文件部署至lib目录并保留入口点功能
我明白你想要的效果——一是把构建产物(dist、build)、虚拟环境(env)都放到lib目录下,不再堆在项目根目录;二是确保安装后所有自己的代码都归在lib这个顶级包下,同时bin和lib里的入口点脚本能正常工作。下面分两步来调整:
一、调整项目结构与setup.py配置,让代码统一归到lib包下
- 调整目录结构:把根目录下的
bin文件夹移动到lib目录内部,变成lib/bin。这样你的所有业务代码就都属于lib这个顶级包了,调整后的目录结构如下:
. ├── README.md ├── lib │ ├── __init__.py │ ├── bin │ │ ├── __init__.py │ │ └── fix_sales_quotes.py │ ├── logger.py │ ├── oracle_dbx_connector │ │ ├── __init__.py │ │ ├── dbx_connector.py │ │ └── timeout.py │ └── sales_quote │ ├── __init__.py │ ├── data │ │ ├── __init__.py │ ├── get_processed_quotes.py │ ├── get_stuck_quotes.py │ ├── get_subscriber_ids.py │ └── get_workflow_events.py │ └── report.py ├── requirements.txt ├── setup.py └── var ├── logs └── reports
- 修改setup.py的核心配置:
- 更新
packages参数,确保只包含lib及其所有子包:packages=find_packages(include=['lib*']), - 调整
entry_points里的模块路径,把原来的bin.xxx改成lib.bin.xxx,其他lib下的路径保持不变:entry_points={ 'console_scripts': [ 'sales_quote.stuck_quotes = lib.sales_quote.data.get_stuck_quotes:main', 'sales_quote.processed_quotes = lib.sales_quote.data.get_processed_quotes:main', 'sales_quote.subscriber_ids = lib.sales_quote.data.get_subscriber_ids:main', 'sales_quote.workflow_events = lib.sales_quote.data.get_workflow_events:main', 'sales_quote.report = lib.sales_quote.report:main', 'sales_quote.fix = lib.bin.fix_sales_quotes:entry_point' # 这里修改了模块路径 ] },
- 更新
二、把构建产物和虚拟环境放到lib目录
自定义虚拟环境位置:创建虚拟环境时直接指定路径到lib下,避免生成在根目录:
python -m venv lib/env激活环境的命令也对应调整:
- Linux/macOS:
source lib/env/bin/activate - Windows:
lib\env\Scripts\activate.bat
- Linux/macOS:
指定构建产物的输出目录:
推荐在项目根目录创建setup.cfg文件,添加以下配置,这样每次构建时无需手动加参数:[build] build-base = lib/build [bdist_wheel] dist-dir = lib/dist [sdist] dist-dir = lib/dist之后运行
python setup.py sdist bdist_wheel,生成的安装包会放在lib/dist,临时构建文件会存到lib/build。
验证效果
完成以上调整后,在虚拟环境中运行pip install .安装项目,你会发现site-packages里只有lib目录,所有业务代码都归在这个目录下;同时运行sales_quote.fix、sales_quote.stuck_quotes等入口命令,都能正常执行逻辑。
内容的提问来源于stack exchange,提问作者Branden
相关产品推荐
相关产品推荐

