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

时间:2014-07-10 21:45:01

标签: python-3.x setuptools distutils

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

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

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

setup(
...
scripts=["foo"]
...
)

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

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xcf in position 0: invalid continuation byte

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

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

1 个答案:

答案 0 :(得分:2)

我的解决方案如下:

  • 创建包装器模块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:])
  • 更新setup.py以包含foowrapper,foo和foo_bin

setup(
  ...
  package_data={
    'foowrapper':['foo_bin']
  },
  packages=['foowrapper],
  scripts=['foowrapper/foo']
  ...
)