在 setuptools 中分发二进制实用程序

Dre*_*rew 6 distutils setuptools python-3.x

foo我有一个用深奥的编程语言编写的命令行程序( )。我想将此程序作为使用 setuptools 的现有 python 包的一部分进行分发。 foo应该出现在用户的路径中并且可以从命令行执行,就像 distutil 的脚本或 setuptools 的entry_points的行为一样。

对我来说,为每个平台交叉编译程序,然后使用特定于平台的二进制文件为每个平台构建不同的 Egg 是可行的foo。问题是,我不知道如何说服安装工具将二进制文件复制到目标系统上适合平台的位置。

例如,我尝试使用scripts指令:

setup(
...
scripts=["foo"]
...
)
Run Code Online (Sandbox Code Playgroud)

但似乎 setuptools 不喜欢带有非 utf8 数据的“脚本”。

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xcf in position 0: invalid continuation byte
Run Code Online (Sandbox Code Playgroud)

我可以将其声明为资源,但这不会将其放入用户的路径中。

如何将二进制命令行实用程序作为 python 包的一部分发送?

Dre*_*rew 5

我的解决方案如下:

  • 创建一个包装模块foowrapper
  • foowrapper包含foo(但重命名为foo_bin)和一个名为 的新脚本foo,内容如下:

 #!python
 file = __file__
 import os.path
 cmd = os.path.join(os.path.dirname(__file__),"foo_bin")
 import subprocess
 subprocess.call([cmd] + sys.argv[1:])
Run Code Online (Sandbox Code Playgroud)
  • 更新 setup.py 以包含 foowrapper、foo 和 foo_bin

setup(
  ...
  package_data={
    'foowrapper':['foo_bin']
  },
  packages=['foowrapper],
  scripts=['foowrapper/foo']
  ...
)
Run Code Online (Sandbox Code Playgroud)