Python Script über ein anderes Python Script ausführen

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
xXPythonBezwingerXx
User
Beiträge: 1
Registriert: Donnerstag 7. Dezember 2017, 11:42

Hallo erstmal :)
Ich bin ein absoluter Python & Raspberry Pi Neuling und bin gerade dabei ein paar Sachen auf dem Raspberry auszuprobieren. Ich wollte für eine Projekt Idee herausfinden wie man über ein 1. Python Script ein zweites ausführen kann und eventuell bei bedarf dem 2. Script noch Variablen entnehmen kann. Bei der Recherche bin ich häufiger auf den Begriff "subprocess" gestoßen allerdings konnte ich nirgendwo eine Erklärung finden die mir so wirklich einleuchtet. Ich habe dann versucht ein einfachen test zu machen:

Erstes Script

Code: Alles auswählen

import subprocess

LED = subprocess.Popen(["python /home/pi/Desktop/PythonTest/ZweitesScript.py"])
Zweites Script

Code: Alles auswählen

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.OUT)

for i in range(100):

          GPIO.output(17, GPIO.LOW)
          time.sleep(0.5)
          GPIO.output(17, GPIO.HIGH)
          time.sleep(0.5)

GPIO.cleanup()
Wenn ich das Zweite Script alleine starte dann blinkt die LED die ich an den Raspi angeschlossen habe es muss also irgendwas an dem ersten Script falsch sein. Würde mich wirklich über schnelle Hilfe freuen. Vielen Dank schon mal im voraus :)

LG xXPythonBezwingerXx
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

So macht man das ueblicherweise nicht. Ein Python-Programm aus verschiedenen ueber subprocess aufgerufenen anderen Python-Programmen zu konstruerien ist von hinten durch die Brust ins Auge geschossen.

Stattdessen steckt der Code in *einem* Programm (nach Bedarf auf mehrere Module aufgeteilt).

Da dein erstes Programm auch noch weiter nichts tut, kannst du es fuer den Moment auch einfach wieder loeschen, und mit der eigentlich geplanten Funktion im zweiten Programm weitermachen.
Kopakpy
User
Beiträge: 9
Registriert: Mittwoch 6. Dezember 2017, 22:19

Das 'andere' Script so aufzurufen ist nicht sonderlich gut. Das kann man so machen um zum Beispiel Programme des Betriebssystems aufzurufen.
Ein eigenes Script per "import" einzubinden ist jedoch deutlich effektiver, die Programmteile sind dann außerdem im gleichen Speicherbereich des Computers und können Daten austauschen.
Popen verbraucht deutlich mehr Ressourcen.
http://py-tutorial-de.readthedocs.io/de ... dules.html

Wenn du eine "Nebenläufigkeit" erreichen möchtest gibt es dazu verschiedene andere Verfahren:
  • Zyklusorientiert (Wie bei einer SPS)
  • Ereignisgesteuert
  • Mutlitasking
In Python ist das Mutlitasking (Hier eher Mutlithreading) angesagt. Beispiel:
Dieses threading beispiel kann mehrere wav-Dateien gleichzeitig abspielen:

Code: Alles auswählen

from threading import Thread
import wave
import pyaudio

class sounds:
    def playWavAsync(self,sound):
        thread = Thread(target = self.playWav, args = (sound,))
        thread.start()
        
    def playWav(self,sound):
        wf=wave.open(sound, 'rb')
        CHUNK = 1024
        stream = self.p.open(format=self.p.get_format_from_width(wf.getsampwidth()),
                        channels=wf.getnchannels(),
                        rate=wf.getframerate(),
                        output=True)
        data = wf.readframes(CHUNK)
        while len(data) > 0:
            stream.write(data)
            data = wf.readframes(CHUNK)
        stream.stop_stream()
        stream.close()
        
def __init__(self):
        self.p = pyaudio.PyAudio()        
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Tatsächlich wäre für pyadio ereignisbasiert ebenfalls geeignet. Statt chunks synchron zu schreiben, kann man einen callback registrieren und darin den jeweils benötigten chunk schreiben. Ich ziehe das vor, weil nebenläufigkeit potentiell gefährlich wird.
Kopakpy
User
Beiträge: 9
Registriert: Mittwoch 6. Dezember 2017, 22:19

Oh cool, hast Du ein snippet für den callback?

edit: Hab eins gefunden, sieht ja sehr einfach aus :-)
https://people.csail.mit.edu/hubert/pyaudio/docs/
Antworten