我有awesomepkg
个包setup.py
。当用户运行awesometool
时,我想在命令行中安装二进制可执行文件pip install awesomepkg
以及软件包本身。我为awesometool
编译了不同的操作系统版本,它们位于bin/
旁边的setup.py
文件夹中。
但是,我找不到配置setup.py
的好方法。我尝试了以下方法:
使用scripts=[]
中的setup()
关键字。不幸的是,“可执行文件”必须是python脚本。
所以我尝试使用os.system('bin/awesometool')
将二进制文件包装在python脚本中进行委托。它也失败了,因为包装器脚本被pip复制到其他地方,因此它不知道相对路径bin/awesometool
的位置。
另一个可能的解决方案是data_files
关键字。但是,由于某些原因,数据文件不会复制到site_packages
安装目录,即使运行python setup.py bdist_wheel
表示已复制它们。
答案 0 :(得分:4)
我自己也遇到了这个问题。我的解决方案是三倍。
我添加了该程序,例如awesometool
,我的包结构,因此我可以通过package_data
关键字添加它:
package_data={'awesomepkg': ['awesometool']}
。
这导致它在安装过程中实际上被复制到与主 init .py相同的文件夹中。
我创建了一个类似于步骤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,但结果应该是相同的。
我将此脚本添加到scripts
setup()
关键字
醇>
答案 1 :(得分:1)
要添加到Nick Porubsky的答案中:
chmod +x
时启用了执行标志可以在此处找到一个示例。 https://github.com/HousekeepLtd/pywkher/commit/0bad81240f16479550e2b1bf2c1185a20d3cee29
答案 2 :(得分:0)
从 包中可以使用
import os
command = os.path.join(os.path.dirname(__file__), "awesometool")