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
Systemaufruf mit Ghostscript
@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.
-
- 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.
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.
@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.
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.
-
- 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.
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.
@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?
-
- 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.
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.