2017-02-17 4 views
0

Ich versuche, einen Batch-Befehl in einem Python-Skript auszuführen, wobei einfach der Name der PDF-Datei angezeigt wird. Grundsätzlich befindet sich das Python-Skript in einem Ordner C:\users\me\desktop\python, der einen Befehl in einem anderen Ordner auf dem Desktop (C:\users\me\desktop\some-folder) ausführen soll, der Unterordner mit PDFs enthält. HierBatch-Befehl im Python-Skript ausführen

ist der Code:

from subprocess import call 
import os 

for root, dirs, files in os.walk("../some-folder"): 
    for pdf_file in files: 
     if pdf_file.endswith(".pdf"): 
      pdf_file_path = os.path.join(root, pdf_file) 
      os.chdir(root) 
      call('for %%f in (*.pdf) do @echo %%f') 

Das Ergebnis, das ich bekommen ist "Datei nicht gefunden".

+0

Wenn Sie bereits die Pdf-Namen mit Python erhalten, warum versuchen Sie, sie erneut mit einem Befehl cmd.exe FOR zu iterieren? Ich sehe nicht, dass dies ein Stapelverarbeitungsdateiproblem ist. Sie haben wirklich keinen Batch-Datei-Code in dieser Frage. – Squashman

Antwort

3

Erstens, da Sie integrierte DOS-Befehle aktivieren, müssen Sie shell=True festlegen, um solche Befehle auszuführen.

Zweitens, auch damit wird es nicht funktionieren, da doppelte Prozent für Skripte reserviert sind. Inline-Befehle erfordern eine einzige %.

Und drittens: Verwenden Sie nicht os.chdir, es ist eine schlechte Praxis. Bessere Verwendung cwd Option von subprocess Aufrufe, ermöglicht es, das Verzeichnis bei der Ausführung des Befehls lokal zu ändern.

, die funktionieren würde:

call('for %f in (*.pdf) do @echo %f',shell=True,cwd=root) 

Natürlich ist dies wahrscheinlich ein Beispiel, da Ihr Befehl erreicht nichts: Sie müssen nicht die Ausgabe wieder in Ihrem Python-Skript bekommen, müssen Sie nicht Return-Code überprüfen .. ich denke,

Wenn Sie die Liste der *.pdf in python in Stammverzeichnis (mit vollem Pfad) erhalten möchten, dass Sie

list_of_pdfs = glob.glob(os.path.join(root,"*.pdf")) 

oder in relativ wissen.

list_of_pdfs = [x for x os.listdir(root) if fnmatch.fnmatch(x,"*.pdf")] 

aber da Sie in einer os.walk Schleife sind, werden Sie die Ausgabe so oft bekommen, wie es PDF-Dateien sind, so ist es nicht sehr performant/schlechtes Design & Komplexität.

Für Ihre ganze Umwandlung Schleife würde ich den Konverter für jede Datei aufrufen, keine Notwendigkeit für .bat-Scripting, Sie haben Python !:

from subprocess import call 
import os 

for root, dirs, files in os.walk("../some-folder"): 
    for pdf_file in files: 
     if pdf_file.endswith(".pdf"): 
      call([r"C:\xpdf\bin32\pdftotext","-raw",pdf_file], cwd=root) 

Geben von Argumenten in einer Liste automatisch behandelt Leerzeichen in Dateinamen.

+0

Danke, das hat funktioniert! Wenn ich jedoch nur die PDF-Dateinamen wie im Beispiel drucke, erscheinen alle PDFs mehrfach, obwohl sie nur einmal in der Liste sind. – vdvaxel

+0

Ich sehe, dass Sie Ihre Antwort bearbeitet: Ich bekomme tatsächlich die Ausgabe so oft wie es .pdf-Dateien sind. Wie sollte ich meinen Code ändern, um dies zu verhindern? – vdvaxel

+0

Möchten Sie nur die Dateien drucken oder etwas anderes tun? –