Seite 1 von 1

subprocess check_output und pdflatex unter Windows

Verfasst: Mittwoch 18. Dezember 2019, 18:39
von nieselfriem
Hallo Zusammen

ich versuche mit subprocess meinen pdflatex befehl auszuführen Mittels os.system("pfad + parameter") hat es funktioniert. Man bekommt jedoch nichts verwertbares wie Exitcodes o.Ä. zurück

nun habe ich Folgendes probiert

Code: Alles auswählen

import subprocess
out=subprocess.check_output([ r'"C:\Users\niesel\AppData\Local\Programs\MiKTeX 2.9\miktex\bin\x64\pdflatex.exe"',
                              "-output-directory ",
                              "C:\\Users\\niesel\\Documents\\python\\pdflatex_subprocess\\",
                              "-synctex=1",
                              "-interaction=nonstopmode",
                              "C:\\Users\\niesel\\Documents\\python\\pdflatex_subprocess\\test.tex"],
                            shell=True,
                            stderr=subprocess.STDOUT)
und bekomme leider nur folgendes zurück:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:/Users/niesel/Documents/python/pdflatex_subprocess/createpdf.py", line 12, in <module>
    stderr=subprocess.STDOUT)
  File "C:\Users\niesel\AppData\Local\Programs\Python\Python37\lib\subprocess.py", line 395, in check_output
    **kwargs).stdout
  File "C:\Users\niesel\AppData\Local\Programs\Python\Python37\lib\subprocess.py", line 487, in run
    output=stdout, stderr=stderr)
subprocess.CalledProcessError: Command '['"C:\\Users\\niesel\\AppData\\Local\\Programs\\MiKTeX 2.9\\miktex\\bin\\x64\\pdflatex.exe"', '-output-directory ', 'C:\\Users\\niesel\\Documents\\python\\pdflatex_subprocess\\', '-synctex=1', '-interaction=nonstopmode', 'C:\\Users\\niesel\\Documents\\python\\pdflatex_subprocess\\test.tex']' returned non-zero exit status 1.
Also ich weiß also nicht, warum der Befehl fehlgeschlagen ist. Gibt es eine Möglichkeit, sich den Befehl ausgeben zu lassen, um zu prüfen, warum dieser fehlschlägt?

VG niesel

Re: subprocess check_output und pdflatex unter Windows

Verfasst: Mittwoch 18. Dezember 2019, 18:42
von Sirius3
Das `shell=True` gehört weg. Das sollte eh nicht benutzt werden. "-output-directory " hat ein Leerzeichen zu viel.

Re: subprocess check_output und pdflatex unter Windows

Verfasst: Mittwoch 18. Dezember 2019, 18:45
von __blackjack__
@nieselfriem: Das ``shell=True`` gehört da nicht rein. Ich würde dann auch eher die `run()`-Funktion mit ``check=True`` aufrufen und da reicht es nicht `stderr` auf `stdout` umzuleiten, man muss dann auch `stdout` mit `subprocess.PIPE` umleiten. Der Rückgabecode steckt in der Ausnahme, die muss man dann auch auswerten.

Und das Problem wird sein das LaTeX die Option "-output-directory " nicht kennt. Man beachte das Leerzeichen nach dem "y".

Re: subprocess check_output und pdflatex unter Windows

Verfasst: Mittwoch 18. Dezember 2019, 19:17
von nieselfriem
ich habe es jetzt mal mit die korrekurren und die run-Methode probiert:

Code: Alles auswählen

out=subprocess.check_output([ r'"C:\Users\niesel\AppData\Local\Programs\MiKTeX 2.9\miktex\bin\x64\pdflatex.exe"',
                              "-output-directory",
                              "C:\\Users\\niesel\\Documents\\python\\pdflatex_subprocess\\",
                              "-synctex=1",
                              "-interaction=nonstopmode",
                              "C:\\Users\\niesel\\Documents\\python\\pdflatex_subprocess\\test.tex"],
                             stderr=subprocess.STDOUT)

Code: Alles auswählen

out = subprocess.run([r'"C:\Users\niesel\AppData\Local\Programs\MiKTeX 2.9\miktex\bin\x64\pdflatex.exe"',
                      "-output-directory",
                      "C:\\Users\\niesel\\Documents\\python\\pdflatex_subprocess\\",
                      "-synctex=1",
                      "-interaction=nonstopmode",
                      "C:\\Users\\niesel\\Documents\\python\\pdflatex_subprocess\\test.tex"],
                      check=True,
                      stdout=subprocess.PIPE,
                      universal_newlines=True)
Allerdings bekomme ich dann

Code: Alles auswählen

Traceback (most recent call last):
  File "C:/Users/niesel/Documents/python/pdflatex_subprocess/createpdf.py", line 17, in <module>
    universal_newlines=True)
  File "C:\Users\niesel\AppData\Local\Programs\Python\Python37\lib\subprocess.py", line 472, in run
    with Popen(*popenargs, **kwargs) as process:
  File "C:\Users\niesel\AppData\Local\Programs\Python\Python37\lib\subprocess.py", line 775, in __init__
    restore_signals, start_new_session)
  File "C:\Users\niesel\AppData\Local\Programs\Python\Python37\lib\subprocess.py", line 1178, in _execute_child
    startupinfo)
PermissionError: [WinError 5] Zugriff verweigert

 :roll: 
VG niesel

Re: subprocess check_output und pdflatex unter Windows

Verfasst: Mittwoch 18. Dezember 2019, 19:20
von sparrow
Das ist ein Zugriffsproblem auf eine Datei. Entweder fehlen dir die nötigen Rechte oder die Datei wird von einem anderen Programm (teilweise) gesperrt.
Hast du die PDF noch offen, die geschrieben werden soll?

Re: subprocess check_output und pdflatex unter Windows

Verfasst: Mittwoch 18. Dezember 2019, 19:32
von nieselfriem
Daran liegt es nicht. Denn mit

Code: Alles auswählen

output_path="C:\\Users\\niesel\\Documents\\python\\pdflatex_subprocess\\"
tex_path="C:\\Users\\niesel\\Documents\\python\\pdflatex_subprocess\\test.tex"
pdflatex="\"C:\\Users\\niesel\\AppData\\Local\\Programs\\MiKTeX 2.9\\miktex\\bin\\x64\\pdflatex.exe\" " \
                           "-output-directory {0}  -synctex=1 -interaction=nonstopmode {1}".format(
                    output_path, tex_path)
run = os.system(pdflatex)
funktioniert es und die PDF wird erzeugt.

vg niesel

Re: subprocess check_output und pdflatex unter Windows

Verfasst: Mittwoch 18. Dezember 2019, 19:37
von sparrow
Warum steht denn der Aufruf des Programms in Anführungszeichen?
Man übergibt die einzelnen Argumente des Aufrufs ja gerade als Elemente einer Liste, damit man das nicht tun muss.

Code: Alles auswählen

r"C:\Users\niesel\AppData\Local\Programs\MiKTeX 2.9\miktex\bin\x64\pdflatex.exe"
Also ohne zusätzliche ' drumherum

Re: subprocess check_output und pdflatex unter Windows

Verfasst: Mittwoch 18. Dezember 2019, 19:38
von Sirius3
Ja, diese kleinen Strichchen. Warum hast Du hier ›r'"‹ verschachtelte Anführungszeichen? Die Anführungszeichen sind nur nötig, weil Du bei os.system irgendwie sagen mußt, was der Dateiname inklusive Leerzeichen ist. Das ist bei subprocess nicht nötig, also werden die Anführungszeichen als Teil des Programmnamens interpretiert.

Re: subprocess check_output und pdflatex unter Windows

Verfasst: Mittwoch 18. Dezember 2019, 20:07
von nieselfriem
Hallo zusammen,

mit

Code: Alles auswählen

    out = subprocess.run([r"C:\Users\niesel\AppData\Local\Programs\MiKTeX 2.9\miktex\bin\x64\pdflatex.exe",
                          "-output-directory",
                          r"C:\Users\niesel\Documents\python\pdflatex_subprocess",
                          "-synctex=1",
                          "-interaction=nonstopmode",
                          r"C:\Users\niesel\Documents\python\pdflatex_subprocess\tesst.tex"],
                          stdout=subprocess.PIPE,
                          universal_newlines=True)
funktioniert es.

Danke für eure Mühe