Python 包安装脚本安装二进制可执行文件

Python package setup script install binary executable

我有一个包裹 awesomepkgsetup.py。当用户 运行 pip install awesomepkg 时,我想将二进制可执行文件 awesometool 与包本身一起安装到命令行。我为 awesometool 编译了不同的 OS 版本,它位于 setup.py 旁边的 bin/ 文件夹中。

但是,我找不到配置的好方法setup.py。我尝试了以下操作:

  1. setup()中使用scripts=[]关键字。不幸的是,"executable" 必须是 python 脚本。

  2. 所以我尝试使用 os.system('bin/awesometool') 将二进制文件包装在 python 脚本中进行委托。它也失败了,因为包装器脚本被 pip 复制到其他地方,所以它不知道相对路径 bin/awesometool 在哪里。

  3. 另一个可能的解决方案是 data_files 关键字。但是,由于某些原因,数据文件没有复制到 site_packages 安装目录,即使 运行ning python setup.py bdist_wheel 说它们已被复制。

参考:https://docs.python.org/3/distutils/setupscript.html

我自己 运行 进入了这个问题。我的解决方案是三方面的。

  1. 我添加了程序,例如awesometool,到我的包结构中,这样我就可以通过 package_data 关键字添加它: package_data={'awesomepkg': ['awesometool']}。 这导致它在安装过程中实际上被复制到与主 init.py 相同的文件夹中。

  2. 我制作了一个类似于您的第 2 步的 python 脚本。但是,我首先导入 awesomepkg 并使用 awesomepkg.__path__ 获取相对路径,而不是相对路径包安装文件夹的绝对路径。这看起来像:

    import awesomepkg
    import subprocess as sp
    import sys
    
    path = awesomepkg.__path__[0]
    command = path + "/awesometool"
    sp.call([command] + sys.argv)
    

    我也用了subprocess而不是system,但是结果应该是一样的

  3. 我将此脚本添加到 setup()

  4. scripts 关键字

一个包可以使用

import os
command = os.path.join(os.path.dirname(__file__), "awesometool")

补充 Nick Porubsky 的回答:

  1. 确保二进制文件在提交时已启用执行标志chmod +x
  2. 确保你的 bash 脚本上有一个 shebang 以便它知道用 Python
  3. 执行

可在此处找到相关示例。 https://github.com/HousekeepLtd/pywkher/commit/0bad81240f16479550e2b1bf2c1185a20d3cee29