2010-11-20 3 views
4

Я пытаюсь запустить pdflatex в .tex-файле из Python 2.4.4. подпроцесс (на mac):pdflatex в подпроцессе python на mac

import subprocess 
subprocess.Popen(["pdflatex", "fullpathtotexfile"], shell=True) 

который фактически ничего не делает. Тем не менее, я могу запустить «pdflatex fullpathtotexfile» в терминале без проблем, создавая pdf. Что мне не хватает?

[EDIT] Как предлагается в одном из ответов, я попробовал:

return_value = subprocess.call(['pdflatex', '/Users/Benjamin/Desktop/directory/ON.tex'], shell =False) 

который терпит неудачу с:

Traceback (most recent call last): 
    File "/Users/Benjamin/Desktop/directory/generate_tex_files_v3.py", line 285, in -toplevel- 
    return_value = subprocess.call(['pdflatex', '/Users/Benjamin/Desktop/directory/ON.tex'], shell =False) 
    File "/Library/Frameworks/Python.framework/Versions/2.4//lib/python2.4/subprocess.py", line 413, in call 
    return Popen(*args, **kwargs).wait() 
    File "/Library/Frameworks/Python.framework/Versions/2.4//lib/python2.4/subprocess.py", line 543, in __init__ 
    errread, errwrite) 
    File "/Library/Frameworks/Python.framework/Versions/2.4//lib/python2.4/subprocess.py", line 975, in _execute_child 
    raise child_exception 
OSError: [Errno 2] No such file or directory 

файл существует, и я могу запустить pdflatex /Users/Benjamin/Desktop/directory/ON.tex в Терминал. Обратите внимание, что pdflatex делает бросить большое количество предупреждений ... но это не имеет значения, и это также дает ту же ошибку:

return_value = subprocess.call(['pdflatex', '-interaction=batchmode', '/Users/Benjamin/Desktop/directory/ON.tex'], shell =False) 

ответ

3

Используйте функцию удобства, subprocess.call

Вам не нужно использовать Popen здесь, call должно хватить.

Например:

>>> import subprocess 
>>> return_value = subprocess.call(['pdflatex', 'textfile'], shell=False) # shell should be set to False 

Если вызов был успешным, return_value будет установлен в 0, либо 1.

Использование Popen обычно в тех случаях, когда вы хотите магазину выход. Например, вы хотите проверить, для выпуска ядра с помощью команды uname и сохранить его в какой-либо переменной:

>>> process = subprocess.Popen(['uname', '-r'], shell=False, stdout=subprocess.PIPE) 
>>> output = process.communicate()[0] 
>>> output 
'2.6.35-22-generic\n' 

Опять же, никогда не заходило shell=True.

+0

примечание: 'shell = False' является значением по умолчанию (вам не нужно передавать его явно) – jfs

1

Вы могли бы хотеть либо:

output = Popen(["pdflatex", "fullpathtotexfile"], stdout=PIPE).communicate()[0] 
print output 

или

p = subprocess.Popen(["pdflatex" + " fullpathtotexfile"], shell=True) 
sts = os.waitpid(p.pid, 0)[1] 

(Бесстыдно сорвано с этого subprocess doc page section).

+0

Для 1) Мне нужен stdout = subprocess.PIPE, я думаю, но он все еще дает ошибку «OSError: [Errno 2] Нет такого файла или каталога», хотя есть и работает в терминале. Для 2) ничего не происходит, когда я запускаю его, хотя sts установлен. – Benjamin

+0

Так что он жалуется, что не может найти «pdflatex». Возможно, это псевдоним в оболочке. Возможно, вы можете попробовать полный путь к pdflatex. – mjhm

+0

Бинго, давая полный путь работы, хотя это псевдоним pdftex. Хотя это решает мою проблему, я предпочитаю синтаксис сухбира. Спасибо за вашу помощь. – Benjamin

Смежные вопросы