如何通过Wheel包将demo.bin部署到系统/usr/bin目录?
问题描述
项目结构
. ├── demo │ └── __init__.py ├── demo.bin └── setup.py
文件内容
demo/__init__.py
if __name__ == "__main__": print("You're in demo")
demo.bin
#!/bin/bash echo "You're in demo too"
setup.py
import setuptools setuptools.setup( name="demo", version="0.1.0", description="a demo", author_email="", packages=["demo"], data_files=[ ("/usr/bin", ["demo.bin"]), ], )
遇到的问题
按以下步骤安装Wheel包,期望把demo.bin部署到/usr/bin目录,但未达到预期:
- 执行
python3 setup.py bdist_wheel构建Wheel包 - 打开生成的
dist/demo-0.1.0-py3-none-any.whl,可见内部包含/usr/bin/demo.bin - 安装Wheel包(示例:通过Docker容器执行
pip install /tmp/demo/demo-0.1.0-py3-none-any.whl) - 包已正确安装(可通过
python -c "import demo"验证),但demo.bin没出现在/usr/bin,反而被放到了/usr/local/lib/python3.13/site-packages/usr/bin/demo.bin
解决方案
问题根源
Wheel包规范不支持绝对路径的data_files,pip安装时会自动把绝对路径转成相对路径,将文件放到Python的site-packages目录下对应的子路径里,这就是为什么你会在site-packages/usr/bin下找到它。
正确实现方式:用scripts参数
setuptools的scripts参数专门用来安装可执行脚本到系统二进制目录(比如/usr/local/bin,具体路径取决于Python环境配置)。修改setup.py如下:
import setuptools setuptools.setup( name="demo", version="0.1.0", description="a demo", author_email="", packages=["demo"], scripts=["demo.bin"], # 替换原来的data_files配置 )
验证步骤
- 重新构建Wheel包:
python3 setup.py bdist_wheel - 安装包后,直接执行
demo.bin就能运行,或者用which demo.bin查看安装位置,会显示在系统的bin目录下(比如/usr/local/bin/demo.bin)
可选:强制安装到/usr/bin
如果一定要把脚本放到/usr/bin而非默认的/usr/local/bin,可以在安装时指定前缀:
sudo pip install --prefix=/usr /path/to/demo-0.1.0-py3-none-any.whl
注意需要sudo权限,避免权限不足的问题。
内容的提问来源于stack exchange,提问作者bux
相关产品推荐
相关产品推荐

