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

时间:2017-09-10 16:28:16

标签: python pip setuptools

我有awesomepkg个包setup.py。当用户运行awesometool时,我想在命令行中安装二进制可执行文件pip install awesomepkg以及软件包本身。我为awesometool编译了不同的操作系统版本,它们位于bin/旁边的setup.py文件夹中。

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

  1. 使用scripts=[]中的setup()关键字。不幸的是,“可执行文件”必须是python脚本。

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

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

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

3 个答案:

答案 0 :(得分:4)

我自己也遇到了这个问题。我的解决方案是三倍。

  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. 我将此脚本添加到scripts

  4. setup()关键字

答案 1 :(得分:1)

要添加到Nick Porubsky的答案中:

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

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

答案 2 :(得分:0)

包中可以使用

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