Инсталирах 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. Когато напиша това в интерактивната обвивка на 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: Команда '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