2012-03-30 2 views
4

У меня есть кодовая база, которая содержит некоторые C++-коды и скрипты Python, которые используют полученные двоичные файлы (через модуль subprocess).Python скрипты, которые зависят от двоичных файлов ... как распределить?

root/ 
    experiments/ 
     script_1.py (needs to call binary_1) 
    clis/ 
     binary_1.cc 
     binary_1 

Каков наилучший способ обратиться к двоичному файлу из сценариев Python?

  • Относительный путь из каталога сценария Python к двоичной, которая предполагает, что пользователь будет запущен скрипт Python из определенного каталога
  • Просто двоичное имя, которое принимает на себя пользователь будет добавлен каталог бинарной в к переменной $PATH, или скопировали двоичный код на /usr/local/bin или что-то
  • Что-то еще?
+0

Это инструмент, который будет вызываться только из модуля python и никогда не используется в одиночку? – Keith

+0

@Keith Он также используется сам по себе, помимо того, что его вызывают из Python. –

ответ

1

Если ваши двоичные файлы предварительно скомпилированы, вы можете использовать параметр data_files для setuptools. Установите его в/usr/local/bin.

data_files=[("/usr/local/bin", glob("bin/*"))], ... 
0

По моему опыту, лучший способ интегрировать C (PP) код в вашей программе Python является make a compiled Python module out of the C(pp) code вместо использования подпроцесс модуля, как вы сейчас делаете.

В дополнение к более последовательной и читаемой кодовой базе Python вы получаете дополнительное преимущество модульности (в том числе решение проблем с PATH) и может use distutils as build tool. Распространение также проще, так как setup.py автоматизирует его.

+0

Еще одна вещь ... мои двоичные файлы cpp - это автономные средства командной строки, полезные сами по себе, кроме того, что они вызываются скриптами Python, поэтому преобразование их в скомпилированные модули python на самом деле не так, как мне кажется , –

+0

Это все еще путь. Вам нужно просмотреть свой дизайн: создать библиотеку из инструментов Cpp и естественным образом использовать ее как в интерфейсе Cpp модуля Python, так и в интерфейсе командной строки. Вы разделили свой код на 3 подпроекта; эта модульность хороша: эти принципы проектирования фактически существуют именно для решения проблемы, с которой вы сейчас сталкиваетесь. – agravier

1

Вы можете использовать __file__, чтобы узнать расположение сценария Python, так что это не имеет значения, где пользователь запустил скрипт.

path = os.path.normpath(os.path.join(
     os.path.dirname(__file__), '..', 'clis', 'binary_1' 
     )) 
Смежные вопросы