subprocess check_output und pdflatex unter Windows

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
nieselfriem
User
Beiträge: 135
Registriert: Sonntag 13. Januar 2013, 16:00

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
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Das `shell=True` gehört weg. Das sollte eh nicht benutzt werden. "-output-directory " hat ein Leerzeichen zu viel.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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".
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
nieselfriem
User
Beiträge: 135
Registriert: Sonntag 13. Januar 2013, 16:00

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
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

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?
Benutzeravatar
nieselfriem
User
Beiträge: 135
Registriert: Sonntag 13. Januar 2013, 16:00

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
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

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
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Benutzeravatar
nieselfriem
User
Beiträge: 135
Registriert: Sonntag 13. Januar 2013, 16:00

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
Antworten