Использование ruby ​​gem / команды из python - PullRequest
1 голос
/ 05 июня 2011

Я установил гем Ruby '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.Когда я набираю это в интерактивной оболочке 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.Вот трассировка, которую я получил:

Трассировка (последний последний вызов):
Файл "/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 вызывает CalledProcessError (retcode, cmd) CalledProcessError: Command 'haml"/ Volumes / Macintosh HD / Пользователи / neil / Sites / ICSP / sugar.haml" "/ Volumes / Macintosh HD / Пользователи / neil / Sites / ICSP / sugar.html" 'возвратили ненулевой статус выхода 127

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 05 июня 2011

Я вижу, что вы используете, 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 голосов
/ 05 июня 2011

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

>>> 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
...