Python 包安装脚本安装二进制可执行文件
Python package setup script install binary executable
我有一个包裹 awesomepkg
和 setup.py
。当用户 运行 pip install awesomepkg
时,我想将二进制可执行文件 awesometool
与包本身一起安装到命令行。我为 awesometool
编译了不同的 OS 版本,它位于 setup.py
旁边的 bin/
文件夹中。
但是,我找不到配置的好方法setup.py
。我尝试了以下操作:
在setup()
中使用scripts=[]
关键字。不幸的是,"executable" 必须是 python 脚本。
所以我尝试使用 os.system('bin/awesometool')
将二进制文件包装在 python 脚本中进行委托。它也失败了,因为包装器脚本被 pip 复制到其他地方,所以它不知道相对路径 bin/awesometool
在哪里。
另一个可能的解决方案是 data_files
关键字。但是,由于某些原因,数据文件没有复制到 site_packages
安装目录,即使 运行ning python setup.py bdist_wheel
说它们已被复制。
我自己 运行 进入了这个问题。我的解决方案是三方面的。
我添加了程序,例如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,但是结果应该是一样的
我将此脚本添加到 setup()
的 scripts
关键字
从内一个包可以使用
import os
command = os.path.join(os.path.dirname(__file__), "awesometool")
补充 Nick Porubsky 的回答:
- 确保二进制文件在提交时已启用执行标志
chmod +x
- 确保你的 bash 脚本上有一个 shebang 以便它知道用 Python
执行
可在此处找到相关示例。
https://github.com/HousekeepLtd/pywkher/commit/0bad81240f16479550e2b1bf2c1185a20d3cee29
我有一个包裹 awesomepkg
和 setup.py
。当用户 运行 pip install awesomepkg
时,我想将二进制可执行文件 awesometool
与包本身一起安装到命令行。我为 awesometool
编译了不同的 OS 版本,它位于 setup.py
旁边的 bin/
文件夹中。
但是,我找不到配置的好方法setup.py
。我尝试了以下操作:
在
setup()
中使用scripts=[]
关键字。不幸的是,"executable" 必须是 python 脚本。所以我尝试使用
os.system('bin/awesometool')
将二进制文件包装在 python 脚本中进行委托。它也失败了,因为包装器脚本被 pip 复制到其他地方,所以它不知道相对路径bin/awesometool
在哪里。另一个可能的解决方案是
data_files
关键字。但是,由于某些原因,数据文件没有复制到site_packages
安装目录,即使 运行ningpython setup.py bdist_wheel
说它们已被复制。
我自己 运行 进入了这个问题。我的解决方案是三方面的。
我添加了程序,例如
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,但是结果应该是一样的
我将此脚本添加到
setup()
的
scripts
关键字
从内一个包可以使用
import os
command = os.path.join(os.path.dirname(__file__), "awesometool")
补充 Nick Porubsky 的回答:
- 确保二进制文件在提交时已启用执行标志
chmod +x
- 确保你的 bash 脚本上有一个 shebang 以便它知道用 Python 执行
可在此处找到相关示例。 https://github.com/HousekeepLtd/pywkher/commit/0bad81240f16479550e2b1bf2c1185a20d3cee29