Systemaufruf mit Ghostscript

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
michaelhecht
User
Beiträge: 4
Registriert: Donnerstag 26. März 2009, 21:20

Hallo,

ich bin noch ein Python-Rookie, vielleicht ist die Antwort trivial. Für verschiedene Anwendungen benötige ich Systemaufrufe, deren Ausgaben ich auch wieder einlese. Alle möglichen Varianten funktionieren gut, die folgende jedoch nicht. Ich möchte mit ghostscript die Anzahl der Seiten in einem PDF bestimmen. An der Shell oder mit Perl funktioniert der Aufruf perfekt. Über den os.popen-Aufruf (os.system auch) wird ghostscript interaktiv gestartet, d.h. die Kommandozeilenargumente kommen nicht richtig an (vermute ich). Ist irgendetwas an os.popen speziell??? Wie gesagt, das gleiche in Perl funktioniert tadellos.

Hier ist der Code:
import os

file = open("c:/temp/pdfpagecount.ps","w")
print >> file, """

% pdfpagecount.ps
% read pdf file and output number of pages
% based on pdf2dsc.ps with one line taken from ps2ascii.ps

/PDFfile PDFname (r) file def
/PageCountString 255 string def
systemdict /.setsafe known { .setsafe } if

/.show.stdout { (%stdout) (w) file } bind def

/puts { .show.stdout exch writestring } bind def

GS_PDF_ProcSet begin
pdfdict begin
PDFfile
pdfopen begin
/FirstPage where { pop } { /FirstPage 1 def } ifelse
/LastPage where { pop } { /LastPage pdfpagecount def } ifelse

(%%Pages: ) puts
LastPage FirstPage sub 1 add PageCountString cvs puts

quit
"""

result = os.popen("c:/programme/gs/gs8.64/bin/gswin32c.exe -q "
+"-sPDFname=c:/temp/a_pdf_file.pdf c:/temp/pdfpagecount.ps").read()

print result
BlackJack

@michaelhecht: Soweit ich das in Erinnerung habe, muss man `gs` immer ein Argument mitgeben, dass sagt es soll *nicht* interaktiv sein. Irgend etwas mit "batch" wenn ich mich recht erinnere. Das sollte von anderen Programmiersprachen aus auch nicht anders sein.
michaelhecht
User
Beiträge: 4
Registriert: Donnerstag 26. März 2009, 21:20

Hmmm ... auf der Shell benötige ich auch keine Option -dBATCH (diese wäre es wohl gewesen). Daran kann es nicht liegen.

Ich habe es natürlich probiert, dann erhalte ich gar kein Ergebnis, d.h. ghostscript beendet sich zwar, war aber nur deshalb interaktiv, weil irgendetwas mit den Parametern nicht stimmt.

Nur zur Erinnerung: Exakt der gleiche Befehl (die ps-Datei erzeuge ich nur on the fly) funktioniert direkt auf der Shell und auch im Perl Systemaufruf.

Irgendetwas muss in Python anders sein.
BlackJack

@michaelhecht: Solange die Datei nicht geschlossen wird, gibt's keine Garantie, dass der Inhalt auch wirklich in der Datei auf der Festplatte steht. Ist es das eventuell schon?

Edit: Hab's gerade unter Linux nachvollzogen, ohne das schliessen der Datei beendet sich GhostScript nicht, weil die `pdfpagecount.ps` leer ist und damit natürlich auch den ``quit``-Befehl nicht enthält. Hat also nichts mit `os.popen()` zu tun.
Zuletzt geändert von BlackJack am Donnerstag 26. März 2009, 23:33, insgesamt 1-mal geändert.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Generell: Schon mal mit ``subprocess`` ausprobiert?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
michaelhecht
User
Beiträge: 4
Registriert: Donnerstag 26. März 2009, 21:20

Hallo BlackJack,

sorry, aber
a) pdfpagecount.ps ist nicht leer (zumindest bei mir nicht)
b) gs geht nicht in den interaktiven modus, wenn nicht irgendetwas anderes schief läuft
Ich arbeite übrigens unter WinXP, d.h. mit der Windows-Version von gs.

Ich wiederhole mich auch gerne: Exakt das gleiche, codiert in Perl-Syntaxt und ausgeführt in Perl funktioniert.

Hallo Leonidas,

subprocess habe ich noch nicht probiert, aber zumindest os.system und os.popen verhalten sich gleich. Vielleicht wird es mit subprocess aber besser.
BlackJack

@michaelhecht: Woher weisst Du, dass die Datei nicht zum Zeitpunkt des Aufrufs von GhostScript leer ist? Wie hast Du das überprüft? Ob die Datei vor oder nach dem Ablauf Deines Programms etwas enthält, spielt nämlich keine Rolle! Hast Du's mal mit schliessen der Datei vor Aufruf von GhostScript probiert?
michaelhecht
User
Beiträge: 4
Registriert: Donnerstag 26. März 2009, 21:20

Hallo BlackJack,

Asche auf mein Haupt!!!!!!

Wer zu doof ist, eine angelegte Datei auch zu schließen, wenn er fertig ist, verdient nichts Besseres!!!!!

Tatsächlich habe ich in Perl natürlich die Datei pdfpagecount.ps rechtzeitig geschlossen!!! Natürlich hat bei einem Test auf der Shell die Datei pdfpagecount.ps exisitiert (vom letzten py-Script-Aufruf).

In Perl wäre mir das nicht passiert, aber so ist das eben, wenn man seine bevorzugte Script-Sprache verlässt und sich einer neuen zuwendet. Da passieren auch mal Anfängerfehler.

Danke für Deine Geduld!!

Das mit dem Befehl "subprocess" werde ich mir aber trotzdem nochmal genauer ansehen.
Antworten