Script in Programm im Hintergrund laufen lassen

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
Tommel
User
Beiträge: 8
Registriert: Dienstag 16. Dezember 2014, 08:27

Hallo zusammen,

ich bin neu hier und allgemein bei Python. Ich musste mich damit beschäftigen, weil ich ein Automatisierungsscript für das Programm "Scribus" geschrieben habe, das einen Hotfolder überwacht, in definierten Zeitabständen durchsucht und Dateien, die dort abgelet werden öffnet, bearbeitet und an einem anderen Ort abspeichert.
Python deshalb, weil Scribus Python integriert hat. Das heißt ich starte Scribus und danach das Script. Dieses Script soll 24/7 auf einem Server laufen und seine Arbeit verrichten.

Das Problem, das ich damit habe, ist, dass während das Script läuft Scribus so aussieht, als wäre es abgestürzt, weil die Schleife im Script nie aufhört und das Script immer im Vordergrund läuft:

Code: Alles auswählen

while 1: #Initiierung der Endlosschleife
	checkFolder(InPath,OutPath)
	time.sleep(5)
Gibt es irgendeine Möglichkeit, die Arbeit des Scripts in den Hintergrund zu stellen?
Ich hoffe hier gibt es eine eingermaßen einfach Lösung, die man auch mit sehr bescheidenen Programmierkenntnissen und noch bescheideneren Pythonkenntnissen umsetzen kann.
Vielen Dank schonmal.

Gruß Tommel
Hazzard
User
Beiträge: 26
Registriert: Dienstag 4. Dezember 2007, 21:09

Kannst du das Python Skript nicht einfach unabhängig von Scribus starten?
BlackJack

@Hazzard: Dann kann das Skript aber nicht mehr auf das laufende Scribus zugreifen. Python ist dort ja eingebettet.
Tommel
User
Beiträge: 8
Registriert: Dienstag 16. Dezember 2014, 08:27

Genau das ist das Problem. Und so wie ich das verstanden habe, ist es auch nicht möglich von einem externen Script auf die Scribus Funktionen zuzugreifen. Ich meine "Import Scribus" funktioniert nur bei Scripts die innerhalb von Scribus gestartet werden.
Falls jemand eine Möglichkeit hat, wie ich mit einem Script Scribus starten und ein Script innerhalb von Scribus ausführen kann, wäre ich auch für diese Variante dankbar! Das einzige, was ich da als Möglichkeit gefunden hätte, war eine Anordnung von Sendkeys, die die Navigation zu dem Script durchführen, aber das wäre ja hochgradiger Pfusch!
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@Tommel: keine Ahnung ob Scribus mit Threads umgehen kann, aber mehr als Abstürzen kann es ja nicht.
Tommel
User
Beiträge: 8
Registriert: Dienstag 16. Dezember 2014, 08:27

Hi,

danke für den Tip. Da ich aber wie gesagt eigentlich nicht programmieren kann und grad erst beginne diese Welt im Selbststudium zu entdecken, hab ich noch nie mit Threading gearbeitet.

Ich hab also mal Google befragt, mir ein paar Tutorials angeschaut und versucht die Schleife in einem Thread zu starten. Das tut sie auch, allerdings läuft das ganze immer noch nicht im Hintergrund. Es bleibt die nackte Scribus Oberfläche bestehen und sobald ich Scribus anklicke, heißt es "keine Rückmeldung" weil das Script ja läuft und Scribus anscheinend auf eine Rückmeldung, oder ein Ende des Programmablauf wartet, das gezielt in einer Endlosschleife festsitzt.

Ich habe das Ganze jetzt wie folgt geschrieben:

Code: Alles auswählen

import thread
def go(threadName):
	while 1:
		checkFolder(InPath,OutPath) #Aufruf der Prüfung für Converterordner
		time.sleep(5) #Wartezeit in Sekunden vor der nächsten Ausführung

try:
   thread.start_new_thread( go("Thread-1") )
except:
   print "Error: unable to start thread"
Habe ich hier jetzt zu einfach gedacht und was falsch gemacht? Auf jeden Fall scheint Scribus sich nicht an den Threading Funktionen zu stören...

Gruß
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@Tommel: Du erzeugst auch gar keinen Thread für die Funktion go, weil in Zeile 8 go direkt ausgeführt wird. Richtig müßte es so sein:

Code: Alles auswählen

import time
import threading
def go(threadName):
    while True:
        checkFolder(InPath,OutPath) #Aufruf der Prüfung für Converterordner
        time.sleep(5) #Wartezeit in Sekunden vor der nächsten Ausführung
 
threading.Thread(target=go, args=("Thread-1",)).start()
Tommel
User
Beiträge: 8
Registriert: Dienstag 16. Dezember 2014, 08:27

Hallo Sirius3

Danke für den Hinweis! Ich habe deine Modifikation am Code getestet. Damit geht Scribus nicht mehr auf "Keine Rückmeldung" allerdings bleibt auch die Funktion des Scripts aus. Sprich die Datei, die ich in den Hotfolder lege, bleibt unangetastet dort liegen...

Gibt es eine Möglichkeit sichtbar zu machen, ob der Thread überhaupt läuft?
BlackJack

@Tommel: Du könntest Scribus von einer Konsole aus starten und schauen ob ``print``-Ausgaben dort landen. Ansonsten könntest Du Ausgaben in eine Logdatei schreiben.
Tommel
User
Beiträge: 8
Registriert: Dienstag 16. Dezember 2014, 08:27

Dank für den Tip! Da hätt ich auch selber draufkommen können... :oops:

Habs jetzt so geschrieben:

Code: Alles auswählen

def go(threadName):
	while 1:
		fjob_out = open(r"C:\Output.txt", "w")
		fobj_out.write("Thread")
		fobj_out.close()
		checkFolder(InPath1,OutPath1) #Aufruf der Prüfung für Fabrikschilderordner
		checkFolder(InPath2,OutPath2) #Aufruf der Prüfung für Converterordner
		time.sleep(5) #Wartezeit in Sekunden vor der nächsten Ausführung

fjob_out = open(r"C:\Output.txt", "w")
fjob_out.write("Start")
fjob_out.close()
try:
	threading.Thread(target=go, args=("Thread-1",)).start()
except:
   print "Error: unable to start thread"
Und da in meiner Output.txt "Start" drin steht, geh ich mal davon aus, dass der Thread gar nicht losläuft...
Das heißt dann wohl, dass entweder noch ein Fehler beim Aufruf vorliegt, oder Scribus mit Threading nichts anfangen kann, aber trotzdem nicht meckert, oder?
Tommel
User
Beiträge: 8
Registriert: Dienstag 16. Dezember 2014, 08:27

Oh Mann! Tipfehler im Thread: fobj_out statt fjob_out. Trotzdem keine änderung am Ergebnis...

Änderung gibt folgendes:

Code: Alles auswählen

fjob_out = open(r"C:\Output.txt", "w")
fjob_out.write("Start")
fjob_out.close()
try:
	threading.Thread(target=go, args=("Thread-1",)).start()
except:
	fjob_out = open(r"C:\Output.txt", "w")
	fjob_out.write("Error")
	fjob_out.close()
Eintrag in Output.txt lautet "Error"
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@Tommel: es wäre wohl sinnvoller, auszugeben, was für eine Error das ist ("traceback.print_exc(file=fjob_out)").
Tommel
User
Beiträge: 8
Registriert: Dienstag 16. Dezember 2014, 08:27

Der Fehler lautete "Name threading is not defined"
Daraufhin habe ich festgestellt, dass ich "import thread" statt "import threading" geschrieben hatte.
Und diese Änderung hat schließlich den Absturz bewirkt...
Bild

Heißt wohl, dass es nicht geht oder?
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@Tommel: das heißt es wohl :cry: .
Tommel
User
Beiträge: 8
Registriert: Dienstag 16. Dezember 2014, 08:27

Schade! Trotzdem vielen Dank für die schnelle und gute Hilfe!
Immerhin hab ich wieder was dazu gelernt! 8)
Antworten