Распространение бинарной утилиты в setuptools

У меня есть программа командной строки (foo), написанная на эзотерическом языке программирования. Я хотел бы распространять эту программу как часть существующего пакета Python, который использует setuptools. foo должен отображаться в пути пользователя и быть исполняемым из командной строки, во многом аналогично поведению distutil скрипты или setuptools' entry_points.

Я могу кросс-компилировать программу для каждой платформы, а затем собрать отдельное яйцо для каждой платформы с бинарным файлом foo для конкретной платформы. Проблема в том, что я не знаю, как убедить setuptools скопировать двоичный файл в подходящее для платформы место в целевой системе.

Например, я попытался использовать директиву scripts:

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

но, похоже, setuptools не любит «скрипт» с данными, отличными от utf8.

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

Я мог бы объявить его как ресурс, но это не поставило бы его на путь пользователя.

Как отправить бинарную утилиту командной строки в составе пакета Python?


person Drew    schedule 10.07.2014    source источник


Ответы (1)


Мое решение было следующим:

  • Создайте модуль-оболочку 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']
  ...
)
person Drew    schedule 11.07.2014