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

如何通过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目录,但未达到预期:

  1. 执行python3 setup.py bdist_wheel构建Wheel包
  2. 打开生成的dist/demo-0.1.0-py3-none-any.whl,可见内部包含/usr/bin/demo.bin
  3. 安装Wheel包(示例:通过Docker容器执行pip install /tmp/demo/demo-0.1.0-py3-none-any.whl)
  4. 包已正确安装(可通过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配置
)

验证步骤

  1. 重新构建Wheel包:python3 setup.py bdist_wheel
  2. 安装包后,直接执行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 05:13:11