Как выполнить (безопасную) команду оболочки bash в setup.py?

Я использую nunjucks для шаблонов интерфейса в проекте python. Шаблоны Nunjucks должны быть предварительно скомпилированы в производство. Я не использую расширения или асинхронные фильтры в шаблонах nunjucks. Вместо того, чтобы использовать grunt-task для прослушивания изменений в моих шаблонах, я предпочитаю использовать команду nunjucks-precompile (предлагаемую через npm), чтобы развернуть весь каталог шаблонов в templates.js.

Идея состоит в том, чтобы nunjucks-precompile --include ["\\.tmpl$"] path/to/templates > templates.js команду nunjucks-precompile --include ["\\.tmpl$"] path/to/templates > templates.js в файле setup.py, чтобы я мог просто копировать регулярное выполнение скриптов развертывателя.

Я нашел переопределение setuptools, и аргумент скриптов distutils может служить правильной цели, но я не уверен, что это самый простой подход к выполнению.

Другой подход заключается в том, чтобы использовать subprocess для выполнения команды непосредственно в setup.py, но я был предупрежден об этом (скорее, упреждающе IMHO). Я действительно не понимаю, почему нет.

Есть идеи? Аффирмации? Подтверждения?

Обновление (04/2015): – Если у вас нет команды nunjucks-precompile , просто используйте Node Package Manager для установки nunjucks следующим образом:

 $ npm install nunjucks 

  • Как упаковать демона Python с помощью setuptools
  • Setuptools не могут использовать ссылку из dependency_links
  • Когда я запускаю setuptools .egg «как если бы это был сценарий оболочки», что на самом деле происходит?
  • Как создать яйца Python из исходных пакетов distutils?
  • Скрипт после установки с Python setuptools
  • Почему я не могу создать колесо в python?
  • Может ли пакет Python зависеть от конкретной версии управления версиями другого пакета Python?
  • Установка пакетов Python в Windows
  • 2 Solutions collect form web for “Как выполнить (безопасную) команду оболочки bash в setup.py?”

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

    Вот решение, которое безопасно и основано на записи Питера Ламута . Обратите внимание, что это не использует shell = True в вызове подпроцесса. Вы можете обойти требования командной строки в вашей системе развертывания python, а также использовать это для обфускации и упаковки JS все равно.

     from setuptools import setup from setuptools.command.install import install import subprocess import os class CustomInstallCommand(install): """Custom install setup to help run shell commands (outside shell) before installation""" def run(self): dir_path = os.path.dirname(os.path.realpath(__file__)) template_path = os.path.join(dir_path, 'src/path/to/templates') templatejs_path = os.path.join(dir_path, 'src/path/to/templates.js') templatejs = subprocess.check_output([ 'nunjucks-precompile', '--include', '["\\.tmpl$"]', template_path ]) f = open(templatejs_path, 'w') f.write(templatejs) f.close() install.run(self) setup(cmdclass={'install': CustomInstallCommand}, ... ) 

    Я думаю, что ссылка здесь инкапсулирует то, что вы пытаетесь достичь.

    Interesting Posts

    Не удается запустить Flask с использованием Passenger WSGI на общем хостинге Dreamhost

    Как определить разницу между итератором и итерабельностью?

    Может ли веб-драйвер Selenium иметь доступ к глобальным переменным javascript?

    Как получить интерактивную консоль Python в текущем пространстве имен?

    как настроить собственное промежуточное программное обеспечение в django

    Отправка нескольких команд в оболочку bash, которая должна совместно использовать среду

    Как присоединиться к спискам элементов в Python?

    удалить последнюю строку STDOUT в Python

    Самый быстрый способ вычисления подмножества корреляционной матрицы

    Используя Python, переверните целое число и сообщите, если палиндром

    SQLite или текстовый файл?

    заказ JSON sort_keys в Python

    PyCharm показывает ошибку неразрешенных ссылок для действительного кода

    Eclipse PyDev теперь показывает все ссылки на Tkinter как ошибки

    Как подсчитать цифры, буквы, пробелы для строки в Python

    Python - лучший язык программирования в мире.