Seite 1 von 1

Systemaufruf mit Ghostscript

Verfasst: Donnerstag 26. März 2009, 21:42
von michaelhecht
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

Verfasst: Donnerstag 26. März 2009, 22:18
von 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.

Ghostscript

Verfasst: Donnerstag 26. März 2009, 22:27
von michaelhecht
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.

Verfasst: Donnerstag 26. März 2009, 23:27
von 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.

Verfasst: Donnerstag 26. März 2009, 23:28
von Leonidas
Generell: Schon mal mit ``subprocess`` ausprobiert?

Verfasst: Freitag 27. März 2009, 08:29
von michaelhecht
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.

Verfasst: Freitag 27. März 2009, 08:34
von 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?

Anfängerfehler!!!

Verfasst: Freitag 27. März 2009, 09:24
von michaelhecht
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.