Использование ruby gem / команды из python

1

Я установил Ruby gem haml на мой mac, который я могу использовать для компиляции haml файлов в html файлы, используя следующую команду на терминале:

haml 'path/to/haml/file.haml' 'desired/html/path/file.html'

Эта команда просто создает html файл на втором пути и не дает вывода в терминале. Так, например, эта команда:

haml "/Volumes/Macintosh HD/Users/me/Sites/ICSP/sugar.haml" "/Volumes/Macintosh HD/Users/me/Sites/ICSP/sugar.html"

Создает файл sugar.html по заданному пути. Теперь я пытаюсь использовать эту функцию из python script. Когда я ввожу это в интерактивную оболочку python IDLE:

>>>import subprocess
>>>subprocess.Popen('haml "/Volumes/Macintosh HD/Users/me/Sites/ICSP/sugar.haml"        "/Volumes/Macintosh HD/Users/me/Sites/ICSP/sugar.html"', shell=True, executable='/bin/bash')
<subprocess.Popen object at 0x159d6f0>

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

Следуя совету icktoofay, я запустил check_call. Вот трассировка, которую я получил:

Traceback (последний последний звонок):
файл "/Users/neil/Desktop/subprocesstest.py", строка 7, в     p = subprocess.check_call (x, shell=True) Файл "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", строка 504, в check_call     raise CalledProcessError (retcode, cmd) CalledProcessError: команда 'haml "/Volumes/Macintosh HD/Users/Neil/Сайты/ICSP/sugar.haml" "/Volumes/Macintosh HD/Users/Neil/Сайты/ICSP/sugar.html" " возвращен non- статус выхода 0 127

В соответствии с bash справочным руководством при поиске команды, которая будет выполнена,

Если имя не является оболочкой функции или встроенный, и содержит нет слэшей, Bash выполняет поиск по каждому элементу из $PATH для каталога, содержащего исполняемый файл с этим именем.... Если эта функция не определена, shell выводит сообщение об ошибке и возвращает статус выхода 127.

Тем не менее, я думал, что он действительно нашел команду haml после добавления shell и исполняемых аргументов, потому что до этого он выдавал "файл или каталог, не найденную ошибку", что указывает на то, что функция не является исполняемой напрямую, а скорее в оболочке.

Теперь, как я могу заставить python найти эту команду haml? Или мне придется использовать некоторые уродливые обходные пути, как applescript, который затем вызывает команду haml.

  • 1
    Вы пытались использовать subprocess.check_call вместо непосредственного использования subprocess.Popen ?
  • 0
    Извините, вопрос кажется слишком длинным, но я постарался предоставить как можно больше информации, чтобы облегчить отладку.
Показать ещё 2 комментария
Теги:
haml
subprocess
command

2 ответа

2
Лучший ответ

Я вижу, что вы используете shell=True, поэтому я ожидал, что все будет работать. Проверял его локально здесь с Python 2.7.1 и haml 3.1.1, и у меня не было проблем с его выполнением. Существуют также некоторые реализации python, которые могут вас заинтересовать, PyHAML, HamlPy, djaml или django-haml.

import subprocess
subprocess.Popen(['haml', 'hello.haml', 'hello.html'], shell=True)

% cat hello.html
<strong class='code' id='message'>Hello, World!</strong>
  • 0
    Я действительно использовал аргумент shell=True . Я попытаюсь использовать полный путь к haml, но, так как я предполагаю, что это будет варьироваться от компьютера к компьютеру, было бы трудно превратить это в распространяемый скрипт. Кроме того, ранее я просматривал реализации python, но кажется, что они не просто мост python для вызова компилятора haml, они фактически сами обрабатывают компиляцию, иногда приводя к выводу, отличному от вывода официального гема haml. Я бы предпочел не рисковать, используя реализацию Python, которая может отстать в поддержке синтаксиса в будущем.
  • 0
    @ Нейл, я вижу это сейчас. Должен просто работать тогда. Очень странно. Может быть, ошибка с хамлом? Я только что проверил это, и он прекрасно работает для меня.
0

shlex.split() является вашим другом, если вы хотите построить args список, подходящий для Popen и его ilk.

>>> import subprocess
>>> import shlex
>>> p = subprocess.Popen(shlex.split('haml "/Volumes/Macintosh HD/Users/me/Sites/ICSP/sugar.haml" "/Volumes/Macintosh HD/Users/me/Sites/ICSP/sugar.html"'))
>>> p.wait()
0

Ещё вопросы

Сообщество Overcoder
Наверх
Меню