pdflatex in a python subprocess on mac
I'm trying to run pdflatex on a .tex file from a Python 2.4.4. subprocess (on a mac):
import subprocess
subprocess.Popen(["pdflatex", "fullpathtotexfile"], shell=True)
which effectively does nothing. However, I can run "pdflatex fullpathtotexfile" in the terminal without issues, generating a pdf. What am I missing?
[EDIT] As suggested in one of the answers, I tried:
return_value = subprocess.call(['pdflatex', '/Users/Benjamin/Desktop/directory/ON.tex'], shell =False)
which fails with:
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
The file does exist and I am able to run pdflatex /Users/Benjamin/Desktop/directory/ON.tex
in the Terminal. Note that pdflatex does throw a good number of warnings... but that shouldn't matter, and this also gives the same error:
return_value = subprocess.call(['pdflatex', '-interaction=batchmode', '/Users/Benjamin/Desktop/directory/ON.tex'], shell =False)
Use the convenience function, subprocess.call
You don't need to use Popen
here, call
should suffice.
For example:
>>> import subprocess
>>> return_value = subprocess.call(['pdflatex', 'textfile'], shell=False) # shell should be set to False
If the call was successful, return_value
will be set to 0, or else 1.
Usage of Popen
is typically for cases when you want the store the output. For example, you want to check for the kernel release using the command uname
and store it in some variable:
>>> process = subprocess.Popen(['uname', '-r'], shell=False, stdout=subprocess.PIPE)
>>> output = process.communicate()[0]
>>> output
'2.6.35-22-generic\n'
Again, never set shell=True
.
You might want either:
output = Popen(["pdflatex", "fullpathtotexfile"], stdout=PIPE).communicate()[0]
print output
or
p = subprocess.Popen(["pdflatex" + " fullpathtotexfile"], shell=True)
sts = os.waitpid(p.pid, 0)[1]
(Shamelessly ripped from this subprocess doc page section ).
精彩评论