Предположим, у меня есть пакет, который вызывает исполняемый файл где-то в коде (например, сторонняя c / java-программа). Предположим далее, что приложение достаточно маленькое / тривиальное, чтобы связать его с пакетом. Например, один исполняемый файл (cfoo
).
Я мог бы пойти дальше и поместить файлы в следующую структуру:
.
|-- foo
| |-- __init__.py
| |-- __init__.pyc
| |-- core.py
| |-- corebin
| | `-- cfoo
| `-- foomain.py
`-- setup.py
И приготовьте setup.py
следующим образом:
from setuptools import setup
setup(
name='foo',
version='1.0',
packages=['foo'],
scripts=['foo/foomain.py'],
package_data={'foo': ['corebin/*']},
zip_safe=False
)
Это позволит мне правильно установить пакет. Позже, в коде пакета я мог сделать это:
from subprocess import call
import pkg_resources as res
def main():
fn = res.resource_filename('foo', 'corebin/cfoo')
print "Resource located at:", fn
call([fn])
К сожалению, исполняемый файл будет установлен без установленного флага . Даже если исходный файл был установлен. Добавление вызова chmod
в конце сценария setup.py
не так просто, так как сначала нужно найти правильный путь установки. Я попытался с resource_filename
, но это вернуло локальный файл (как в «предварительной установке»).
Как решить эту проблему? Также с учетом virtualenv
...