Я установил на свой Mac гем Ruby 'haml', который я могу использовать для компиляции 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"
Создает файл сахара.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/Users/neil/Sites/ICSP/sugar .haml" "/Volumes/Macintosh HD/Users/neil/Sites/ICSP/sugar.html"' вернул ненулевой статус выхода 127
Согласно справочному руководству по bash, при поиске команды для выполнения ,
Если имя не является ни функцией оболочки, ни встроенной функцией и не содержит косых черт, Bash ищет в каждом элементе $PATH каталог, содержащий исполняемый файл с таким именем. ... Если эта функция не определена, оболочка выводит сообщение об ошибке и возвращает статус выхода 127.
Тем не менее, я думал, что это действительно находит команду haml после добавления оболочки и исполняемых аргументов, потому что до этого она выдавала «файл или каталог не найден», что указывает на то, что функция не является исполняемой напрямую, а скорее в оболочке Только.
Теперь, как мне заставить python найти эту команду haml? Или мне придется использовать какое-то уродливое обходное решение, такое как applescript, который затем вызывает команду haml.
subprocess.check_call
вместо прямого использованияsubprocess.Popen
? - person icktoofay   schedule 05.06.2011subprocess.check_call(['/path/to/haml', '/your/file.haml', '/your/file.html'])
- person icktoofay   schedule 05.06.2011