mabue88
Goto Top

Python-Programm in LUA aufrufen, aber nicht warten bis es beendet ist

Hallo Zusammen,
ich hab mal wieder eine Frage:
ich muss mit der Programmiersprache LUA ein Python-Programm starten.
Das ist soweit kein Problem. Das Python-Programm benötigt allerdings etwas Zeit bis es beendet ist. Solang will/kann ich nicht mit dem LUA-Programm warten.
Gibt es eine Möglichkeit das Python-Programm aufzurufen und anschließend sofort im LUA-Programm weiterzuarbeiten ohne auf das Beenden des Python-Programms zu warten?

Danke
mabue88

Content-Key: 202010

Url: https://administrator.de/contentid/202010

Ausgedruckt am: 28.03.2024 um 17:03 Uhr

Mitglied: 64748
64748 19.02.2013 um 12:48:58 Uhr
Goto Top
Hallo mabue88,

eine spontane Idee, ich bin kein Programmierer: fork. Also unter Unix/Linux wird man das so machen, dass das Lua-Programm mit dem fork-Systemaufruf das Python-Programm startet. http://de.wikipedia.org/wiki/Fork_(Unix)
Du schreibst nicht, auf welchem Betriebssystem Du programmierst, aber unter Windows sollte es was Vergleichbares geben.


Für Perl gibt es fork als Systemaufruf, Python und Lua kenne ich nicht, aber für Lua sollte es das auch geben.

Markus
Mitglied: mabue88
mabue88 19.02.2013 um 13:52:17 Uhr
Goto Top
Hallo Markus,

prima Hinweis. Habs hinbekommen.
Ich programmiere in Linux/Debian auf einem Raspberry Pi.

Hier meine Lösung:

posix-Paket installieren:
sudo apt-get install lua-posix-dev

Danach kann das LUA-Programm angepasst werden:
	local posix = require "posix"  
	local pid = posix.fork()
	
	-- Wenn PID = 0, dann handelt es sich um das Kind
	if(pid == 0) then
		os.execute("./python_prog.py")  
	end

Damit funktioniert das wunderbar!
Danke!
Mitglied: mabue88
mabue88 19.02.2013 um 23:26:31 Uhr
Goto Top
Leider bin ich doch noch nicht ganz am Ziel.

Die mit dem Code erzeugen Kinderprozesse werden nicht beendet. Das heisst, dass ich irgendwann zig hunderte Prozesse am Laufen habe. Das heisst ich muss den erstellen Kindprozess nach dem "os.execute()" gezielt beenden.

Aber wie macht man das?
Mitglied: 64748
64748 19.02.2013 aktualisiert um 23:43:24 Uhr
Goto Top
Wie gesagt, ich bin kein Programmierer, vielleicht postet hier noch jemand der sich besser auskennt.

Du kannst den Kindprozess anhand der PID killen, ggf. auch per Name. Hier http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammie ... steht was. Die Sache mit dem fork ist eigentlich sehr gut dokumentiert. Im Zweifel kannst Du mit parsen z.B. von
ps -e
herausfinden, welche PID der Prozess hat. Normalerweise sollte aber auch der fork-Aufruf in Lua die PID zurückgeben, aber das sind Dinge mit denen ich mich nicht gut auskenne.

Wichtig ist, dass Du verstehst, dass fork ein Unix-Systemaufruf ist, das hat mit der jeweiligen Programmiersprache nur am Rande zu tun.

Generell suche mit Google nach "Unix-Systemprogrammierung", da findest Du die nötigen Infos (hoffentlich).

Markus
Mitglied: mabue88
mabue88 28.02.2013 um 17:59:03 Uhr
Goto Top
Ich habe das Problem jetzt so gelöst:

In dem LUA-Skript rufe ich ein Programm auf, das ich in C geschrieben habe. Die ganze Sache mit dem fork erledige ich dann in diesem Programm. Der Elternprozess wird geschlossen, das LUA-Skript läuft weiter und der Kindprozess kann vor sich hinarbeiten.

@64748: Danke für deine Unterstützung!