pdflatex в подпроцессе Python на Mac - PullRequest
4 голосов
/ 20 ноября 2010

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

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)

Ответы [ 2 ]

4 голосов
/ 20 ноября 2010

Используйте вспомогательную функцию, 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.

1 голос
/ 20 ноября 2010

Может потребоваться:

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

или

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

(беззастенчиво вырванный из этого раздела страницы документа подпроцесса ).

...