Ich öffne mit einem Pythonscript ein TCP Socket Server, um über eine App Befehle von Handy aus an das Script per WLAN zu senden, die dann ausgeführt werden.
Unter anderen starte ich dazu mit einem Befehl (autonom) innerhalb des Scriptes ein weiteres Pythonscript. Leider hab ich bisher keine Möglichkeit gefunden dieses Script dann auch über einen weiteren Befehl innerhalb der Python Datei worüber alles ausgeführt wird, auch wieder zu beenden. Eventuell weis hier jemand Rat dazu.
Ich hatte dazu die Idee, die mit dem Befehl gestartete Python Datei, deren Prozess PID auszulesen und in einer Variable zu schreiben. Die dann von einer Funktion ausgelesen werden kann, um in der Funktion dann die mit Hilfe eines Befehls was vom Handy aus kommt, das Script zu beenden.
Also ich benötige ein Beispiel wie ich innerhalb des unten aufgeführten Scriptes, die entsprechende Prozess ID von dem gestarteten Pythonscript auslesen und in eine Variable schreiben kann, damit diese dann in einer anderen Funktion dann ausgelesen und durch den Aufruf dieser Funktion dann die PID beendet wird.
also eine Funktion um eine Prozess ID zu beenden und eine Funktion um dieser überhaupt auszulesen und in eine Variable einer anderen Funktion zu schreiben.
Ich hoffe das es jetzt nicht allzuwirr von mir beschrieben wurde.
Aber über ein sauberes Beispiel, wie man es lösen kann wäre ich sehr dankbar.
Code: Alles auswählen
import asyncore
import socket
import select
import RPi.GPIO as GPIO
import serial
import time
import os
#Initial GPIO-setup
GPIO.setwarnings(False)
#GPIO.cleanup()
# to use Raspberry Pi board pin numbers
GPIO.setmode(GPIO.BOARD)
GPIO.setup(19,GPIO.OUT)
GPIO.setup(7,GPIO.OUT)
GPIO.setup(22,GPIO.OUT)
GPIO.setup(11,GPIO.OUT)
def ControlAPairOfPins(FirstPin,FirstState,SecondPin,SecondState):
if FirstState == "1":
GPIO.output(int(FirstPin),True)
else:
GPIO.output(int(FirstPin),False)
if SecondState == "1":
GPIO.output(int(SecondPin),True)
else:
GPIO.output(int(SecondPin),False)
return
def Stop():
ControlAPairOfPins("19","0","7","0")
ControlAPairOfPins("22","0","11","0")
def Vorwaerts_fahren():
ControlAPairOfPins("19","1","7","0")
ControlAPairOfPins("22","1","11","1")
def Rechts_fahren_voll():
ControlAPairOfPins("19","1","7","1")
ControlAPairOfPins("22","1","11","1")
def Links_fahren_voll():
ControlAPairOfPins("19","1","7","0")
ControlAPairOfPins("22","0","11","1")
def Rueckwaerts_fahren():
ControlAPairOfPins("19","1","7","1")
ControlAPairOfPins("22","0","11","1")
def Autonom():
sudo python autonom.py() #die Funktion hier ist jetzt leider nicht vollständig, da ich gerade kein zugriff auf das Script habe, was zu hause auf dem Raspi liegt. Ich werde es später korrigieren.
class Client(asyncore.dispatcher_with_send):
def __init__(self, socket=None, pollster=None):
asyncore.dispatcher_with_send.__init__(self, socket)
self.data = ''
if pollster:
self.pollster = pollster
pollster.register(self, select.EPOLLIN)
def handle_close(self):
if self.pollster:
self.pollster.unregister(self)
def handle_read(self):
receivedData = self.recv(8192)
if not receivedData:
self.close()
return
receivedData = self.data + receivedData
while '\n' in receivedData:
line, receivedData = receivedData.split('\n',1)
self.handle_command(line)
self.data = receivedData
def handle_command(self, line):
if line=="forward start":
Vorwaerts_fahren()
self.send('ok\n')
elif line=="forward stop":
Stop()
self.send('ok\n')
if line=="forward left":
Links_fahren_voll()
self.send('ok\n')
elif line=="forward stop":
Stop()
self.send('ok\n')
if line=="forward right":
Rechts_fahren_voll()
self.send('ok\n')
elif line=="forward stop":
Stop()
self.send('ok\n')
if line=="backward start":
Rueckwaerts_fahren()
self.send('ok\n')
elif line=="backward stop":
Stop()
self.send('ok\n')
if line=="autonom":
Autonom()
self.send('ok\n')
else:
self.send('unknown command\n')
print 'command:', line
class Server(asyncore.dispatcher):
def __init__(self, listen_to, pollster):
asyncore.dispatcher.__init__(self)
self.pollster = pollster
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
self.bind(listen_to)
self.listen(5)
def handle_accept(self):
newSocket, address = self.accept()
print "Connected from", address
Client(newSocket,self.pollster)
def readwrite(obj, flags):
try:
if flags & select.EPOLLIN:
obj.handle_read_event()
if flags & select.EPOLLOUT:
obj.handle_write_event()
if flags & select.EPOLLPRI:
obj.handle_expt_event()
if flags & (select.EPOLLHUP | select.EPOLLERR | select.POLLNVAL):
obj.handle_close()
except socket.error, e:
if e.args[0] not in asyncore._DISCONNECTED:
obj.handle_error()
else:
obj.handle_close()
except asyncore._reraised_exceptions:
raise
except:
obj.handle_error()
class EPoll(object):
def __init__(self):
self.epoll = select.epoll()
self.fdmap = {}
def register(self, obj, flags):
fd = obj.fileno()
self.epoll.register(fd, flags)
self.fdmap[fd] = obj
def unregister(self, obj):
fd = obj.fileno()
del self.fdmap[fd]
self.epoll.unregister(fd)
def poll(self):
evt = self.epoll.poll()
for fd, flags in evt:
yield self.fdmap[fd], flags
if __name__ == "__main__":
pollster = EPoll()
pollster.register(Server(("",12340),pollster), select.EPOLLIN)
while True:
evt = pollster.poll()
for obj, flags in evt:
readwrite(obj, flags)
MFG
Zappelmann