Wie starte ich einen pdftk Subprozess in wsgi?

8

Ich muss einen pdftk-Prozess starten, während ich eine Webanfrage in Django ablege, und darauf warten, dass sie fertig ist. Mein aktueller pdftk-Code sieht so aus:

%Vor%

Das funktioniert gut, solange ich unter dem Dev-Server laufe (läuft als Benutzer www-data ). Aber sobald ich zu mod_wsgi umschalte und nichts anderes mehr ändere, bleibt der Code bei proc.communicate() hängen, und "outfile.pdf" bleibt als offenes Dateihandle von null Länge übrig.

Ich habe mehrere Varianten des Subprozess-Aufrufs ausprobiert (sowie das einfache alte os.system) - das Setzen von stdin / stdout / stderr auf PIPE oder auf verschiedene Datei-Handles ändert nichts. Die Verwendung von "shell = True" verhindert, dass proc.communicate() hängen bleibt, aber dann erstellt pdftk die Ausgabedatei nicht, sowohl unter devserver als auch mod_wsgi. Diese Diskussion scheint darauf hinzuweisen, dass es bei OS-Signalen zu einem tieferen Voodoo kommen könnte und pdftk, die ich nicht verstehe.

Gibt es Workarounds, um einen Subprozess-Aufruf wie diesen richtig unter wsgi zu funktionieren? Ich vermeide die Verwendung von PyPDF zum Kombinieren von PDF-Dateien, da ich große Mengen von Dateien (mehrere hundert) kombinieren muss, die nicht genügend Arbeitsspeicher haben (PyPDF muss jede Quelldatei im Speicher behalten, während sie kombiniert wird). p>

Ich mache das unter den letzten Ubuntu, Pythons 2.6 und 2.7.

    
user85461 25.09.2011, 03:26
quelle

2 Antworten

8

Versuchen Sie mit absoluten Dateisystempfaden, Dateien einzugeben und auszugeben. Das aktuelle Arbeitsverzeichnis unter Apache ist nicht das gleiche Verzeichnis wie der Server und könnte alles Mögliche sein.

Zweiter Versuch nach Beseitigung des Offensichtlichen.

Das Programm pdftk ist ein Java-Programm, das darauf angewiesen ist, ein SIGPWR-Signal erzeugen / empfangen zu können, um eine Speicherbereinigung auszulösen oder andere Aktionen auszuführen. Problem ist, dass unter Apache / mod_wsgi im Daemon-Modus Signale innerhalb der Request-Handler-Threads blockiert werden, um sicherzustellen, dass sie nur vom Haupt-Thread empfangen werden, der nach Prozess-Shutdown-Trigger-Ereignissen sucht. Wenn Sie den Prozess zum Ausführen von pdftk abzweigen, erbt er leider die blockierte Sigmask vom Anforderungshandler-Thread. Die Folge davon ist, dass es den Betrieb des Java-Speicherbereinigungsprozesses behindert und dazu führt, dass pdftk auf seltsame Weise fehlschlägt.

Die einzige Lösung dafür ist, Sellerie zu verwenden und das Frontend einen Job an die Sellerie-Warteschlange für Selleryd senden zu lassen, um dann pdftk zu verzweigen und auszuführen. Da dies dann von einem Prozess erfolgt, der von Apache erstellt wurde, haben Sie dieses Problem nicht.

Weitere blutige Details finden Sie in Google für mod_wsgi und pdftk, insbesondere in Google Groups.

Ссылка

    
Graham Dumpleton 25.09.2011, 04:33
quelle
0

Update: Zwei Pdfs zusammen mit Pdftk auf Python 3 zusammenführen:

Es ist mehrere Jahre her, seit diese Frage gestellt wurde. (2011). Das ursprüngliche Poster sagte, dass os.system für sie nicht funktionierte, wenn sie ältere Versionen von Python verwendeten:

  • Python 2.6 und
  • Python 2.7

Auf Python 3.4 hat os.system funktioniert für mich:

  • os importieren
  • os.system ("pdftk" + Vorlagedatei + "fill_form" + Daten_datei + "Ausgabe" + Exportdatei )

Python 3.5 fügt subprocess.run

hinzu
  • subprocess.run ("pdftk" + Vorlagedatei + "fill_form" + Daten_datei + "Ausgabe" + Exportdatei )

  • Ich habe absolute Pfade für meine Dateien verwendet:

    • template_file="/ var / www / meinProjekt / statisch /"

Ich habe dies mit Django 1.10 ausgeführt, wobei die resultierende Ausgabe in export_file gespeichert wurde.

So fügen Sie zwei PDFs zusammen und zeigen die PDF-Ausgabe an:

%Vor%

Bibliotheken:

Tim Langeman 24.03.2017 12:39
quelle