Hallo, ich habs jetzt primitiver gemacht, aber es taugt für meine Anforderungen. Mit einer Arbeitsdatei.
os.system('grep -H "4711" /var/tmp/eingabe* > /var/tmp/work')
work = open('/var/tmp/work','r')
usw...
Hallo, ich habs jetzt primitiver gemacht, aber es taugt für meine Anforderungen. Mit einer Arbeitsdatei.
os.system('grep -H "4711" /var/tmp/eingabe* > /var/tmp/work')
work = open('/var/tmp/work','r')
usw...
Wie sage ich es in Python ? (Einsteigerfragen)? Schau mal ob du hier fündig wirst!
Dann kannst das gleich als Shell-Script schreiben.
Klar, aber es muß ja nach dem open noch ausgewertet werden, da kommt noch mehr. Je nach weiterem Inhalt der 4711-Zeilen folgen verschiedene Aktionen.
Hallo,
`os.system` ist veraltet und sollte nicht mehr für sowas benutzt werden. Das steht sogar wörtlich in der Python-Doku. Stand der Dinge ist das `subprocess` Modul.
Gruß, noisefloor
Hallo ich habe ein paar Fragen hier erst mal der aktuelle Code:
Übrigens das ist mein erstes mal mit Python... also wenn es irgendwelche Fehler gibt bitte sagen!
import RPi.GPIO as GPIO
import time
#########################
### GPIO ###
#########################
# GPIO Nummerierungs-Modus
GPIO.setmode(GPIO.BCM)
# GPIO Bezeichnung/- Definition
Luftventil = 23
GPIO_Merker_OUT = 24
GPIO_Merker_IN = 25
Start = 26
Futterschalle = 27
# GPIO Setup
GPIO.setup(Luftventil, GPIO.OUT) # Pneumatisches Magnetventil
GPIO.setup(GPIO_Merker_OUT, GPIO.OUT) # Vorübergehender Merker (OUT)
GPIO.setup(GPIO_Merker_IN, GPIO.IN) # Vorübergehender Merker (IN)
GPIO.setup(Start, GPIO.IN) # Vorübergehender Starter irgendwann soll er bei einer Uhrzeit das tun
GPIO.setup(Futterschalle, GPIO.IN) # Wenn in der Futterschalle sich noch Futter befindet ist der GPIO-PIN auf high und die nächste Ausgabe muss warten
#########################
### Gruppen ###
#########################
def Futterausgabe_Auto():
if GPIO.input(Start) == GPIO.HIGH:
while True:
if GPIO.input(27) == GPIO.LOW:
GPIO.output(Luftventil, high)
time.sleep(10)
GPIO.output(Luftventil, low)
Hier kommt dann noch was...
Display More
Meine Fragen:
1. GPIO.setup (Start, GPIO.IN) soll mal ersetzt werden. Also wenn eine bestimmte Uhrzeit ist soll das passieren was "Start" aktuell ausführt. Was gibt es und wie funktioniert es?
2. Die Vorübergehenden Merker (GPIO 24-25)... ich weiß nicht ob ich die in diesem Skript noch verwenden werden aber das könnte sein deswegen frage ich nochmal lieber nochmal wie mache, denn ich verstehe die Erklärungen die man im Internet sind nicht hoffe hier wird mir besser geholfen.
Danke schon mal im voraus!
Hallo,
kannst du bitte dein Vorhaben etwas detaillierter beschreiben? Ich verstehe ehrlich gesagt deine Fragen 1 und 2 nicht so ganz.
Mal was allgemeines zu Python:
Beim importieren wird 'as' zum umbenennen benutzt. Du nennst 'GPIO' in 'GPIO' um. Es gibt verschiedene Arten Module zu importieren.
Entweder du importierst RPi:
So kannst du dann alles nutzen was 'RPi' zur Verfügung hat.
Wenn du nur 'GPIO' nutzen möchtest, dann kannst du das so machen:
Man kann dann noch die Module umbenennen, zum Beispiel:
Zur Gestaltung von Python-Programme kannst du dir mal den Style-Guid anschauen.
Hier wo bei dir Sachen wie 'GPIO.setmode(GPIO:BCM)', 'Luftventil' und weiteres steht, da sollten nur Konstanten, Funktionen und Klassen definiert werden. Das nennt man auch Modulebene. Konstanten sind in deinem Fall die GPIO-Nummern.
Die schreibt man in Python dann KOMPLETT_GROSS. Alle anderen Namen, mit Ausnahme von Klassen, die schreibt man in CamelCase-Schreibweise, schreibt man klein_mit_unterstrich.
Dein Programm wird aus einer Funktion mit dem Name 'main' gesteuert. Dort wird dann zu Beginn auch die GPIO definiert und im Anschluss werden daraus weitere Funktionen aufgerufen.
Wenn du GPIO verwendest, musst du sicherstellen damit nach dem Programmende die GPIO-Belegung aufgeräumt wird. Dazu musst du 'cleanup' aufrufen. Damit dass immer ausgeführt wird, egal wie dein Programm beendet wird, verwendet man 'try/finally'
Der Aufbau ist dann nachher in etwa so:
#!/usr/bin/env python3
import time
from RPi import GPIO
LUFTVENTIL_PIN = 23
START_PIN = 26
FUTTER_PIN = 27
def futterausgabe_kontrollieren():
if GPIO.input(START_PIN) == GPIO.HIGH:
while True:
if GPIO.input(FUTTER_PIN) == GPIO.LOW:
GPIO.output(LUFTVENTIL_PIN, GPIO.HIGH)
time.sleep(10)
GPIO.output(LUFTVENTIL_PIN, GPIO.LOW)
def main():
try:
GPIO.setmode(GPIO.BCM)
GPIO.setup(LUFTVENTIL_PIN, GPIO.OUT)
GPIO.setup(START_PIN, GPIO.IN)
GPIO.setup(FUTTER_PIN, GPIO.IN)
futterausgabe_kontrollieren()
finally:
GPIO.cleanup()
if __name__ == "__main__":
main()
Display More
Zum Schluss noch ein Hinweis, gpiozero ist eine Bibliothek zum steuern von GPIO's und ist meiner Meinung nach viel einfacher in der Anwendung. Schau es dir mal an.
Grüße
Dennis
der Hintergrund meiner Frage ist
NewTron Radio oder Peppy Player benutzen pygame-Grafik mit z.Z Modul pynanosvg und das ist abgekündigt (="deprecated") aber noch vorhanden in (Buster) Python 3.7.3. mit pip3 install pynanosvg war das Modul in Python 3 vorhanden und man konnte es importieren mit import svg. In (Bullseye) Python 3.9. führt pip3 install pynanosvg auf Fehler (hier)
Im NewTron Radio wir die Grafik für Fenster oder Teile davon aus SVG-Dateien eingelesen und in ein pygame-image umgewandelt:
import svg
...
svgimg = svg.Parser.parse(svgbuf)
rast = svg.Rasterizer()
strbuf = rast.rasterize(svgimg, w_svg, h_svg)
image = pygame.image.frombuffer(strbuf, size, "RGBA")
pygame_svg liest alle (Sub-)Windows von NewTron Radio ein, das sind SVG-Dateien, ändert Größe und Farbe und legt sie im Speicher ab.
def pygame_svg(svg_file, color, size):
with open(svg_file, "r+") as svgf:
svgbuf = svgf.read()
colorstr = '#%02x%02x%02x' % color
if '#00ffff' in svgbuf:
svgbuf = svgbuf.replace("#00ffff", colorstr)
elif '"#0ff"' in svgbuf:
svgbuf = svgbuf.replace('"#0ff"', '"'+colorstr+'"')
w_svg, h_svg = size
# Modifiziere SVG für Skalierung
if 'viewBox="' in svgbuf:
if re.search('<svg.((?!>).)*height=', svgbuf, re.MULTILINE|re.DOTALL):
svgbuf = re.sub(r'width="(\d+)', 'width="'+str(w_svg), svgbuf, 1)
svgbuf = re.sub(r'height="(\d+)', 'height="'+str(h_svg), svgbuf, 1)
else:
svgbuf = re.sub('viewBox="',
'width="'+str(w_svg)+'" height="'+str(h_svg)+'" viewBox="', svgbuf, 1)
else:
wo_svg = re.search(r'<svg\s+?((?!>).)*width="(\d+)"', svgbuf, re.MULTILINE|re.DOTALL)
ho_svg = re.search(r'<svg\s+?((?!>).)*height="(\d+)"', svgbuf, re.MULTILINE|re.DOTALL)
svgbuf = re.sub(r'<svg\s+?',
'<svg viewBox="0 0 '+wo_svg.group(2)+' '+ho_svg.group(2)+'" ', svgbuf, 1)
svgbuf = re.sub(r'width="(\d+)', 'width="'+str(w_svg), svgbuf, 1)
svgbuf = re.sub(r'height="(\d+)', 'height="'+str(h_svg), svgbuf, 1)
svgimg = svg.Parser.parse(svgbuf)
rast = svg.Rasterizer()
strbuf = rast.rasterize(svgimg, w_svg, h_svg)
image = pygame.image.frombuffer(strbuf, size, "RGBA")
return image
Display More
Mit der Suchmaschine finde ich "cairo" und "librsvg" als Alternative zu pynanosvg.
import cairo
import rsvg
...
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, WIDTH, HEIGHT)
ctx = cairo.Context(surface)
svg = rsvg.Handle(file="test.svg")
svg.render_cairo(ctx)
image = pygame.image.frombuffer(surface.get_data(), (WIDTH, HEIGHT),"ARGB")
Meine Python-Kenntnisse sind sehr basic.
Als Python ?Modul für "cairo" habe ich pycairo gefunden.
Fragen:
Schönen Gruß, kle
Hallo.
Wie ist das hier? Darf man hier noch Einsteigerfragen stellen? Ist ja seit mehr als 365 Tagen nix mehr passiert...
Ich versuch's mal:
Bis jetzt habe ich mir immer einen PI genommen und "live" so lange meine Programme geändert, bis sie gemacht haben, was ich wollte.
Nun ist aber aktuell ein PI schlecht zu bekommen und auch nicht ganz billig
Kurzum: Ich habe mir python mit der IDLE auf meinen Windows Rechner installiert und will hier den Code solange optimieren, bis es passt...
Bei der Studie diverser Artikel ist mir nun auch der Styleguide pep8 untergekommen...
Kann man diesen in die IDLE integrieren? Es ist wie gesagt eine Windows Installation und ich konnte bisher nur Linux Tutorials finden.
Vielleicht kennt ja jemand den richtigen Link, der mich weiterbringt...
Danke!
Grüße
Tom
Moinsen,
IDLE ist nunmehr schon ein Urgestein
Ob das überhaupt noch Verwendung findet, kann und will ich nicht einschätzen. Die meisten oder hier auch oft genannt ist Thonny.
Das ist eine sehr brauchbare IDE mit Debugging Möglichkeiten, und der recht bequemen Funktion externe Bibliotheken einzubinden. Zudem kann diese auch für µController Boards wie dem RasPi PICO PICO W, oder dem ESP in Verbindung mit µPython genutzt werden. Diese IDE ist für falls alle gängigen Betriebssysteme verfügbar, und ich auch Grundbestandteil der RasbianOS Installation mit GUI.
Hallo zusammen,
coole Idee mit dem Thread!!
Ich hätte gleich eine kleine Frage. Falls die Frage hier nicht hinpasst, schreibt mir bitte, dann erstelle ich einen separaten Thread.
Ich möchte in einem Programm mehrere Zeilen „überspringen“. Ich hatte schonmal so etwas ähnliches angefragt und aber festgestellt, dass es in Python erstmal keine gotos gibt. Allerdings wollte ich nochmal nachhaken, da es jetzt darum geht Zeilen zu überspringen und nicht zurückzukehren.
Danke für eure Antworten!
Kaptain
Hallo,
QuoteIch möchte in einem Programm mehrere Zeilen „überspringen“.
Dann setz' den Code in einen if-Block. Das hat aber so gar nichts mit Python zu tun, das gilt für alle Programmiersprache, die if-Bedingungen kennt.
Gruß, noisefloor
da es jetzt darum geht Zeilen zu überspringen und nicht zurückzukehren.
Wenn Du schon so fragst, dann klingt das stark nach Spaghetticode, was Du da hast. Das macht man in Python nicht.
//Edit
Zu spät, da war mein Tab wohl zu lange offen.
Hallo zusammen,
danke für eure Antworten!!
Ich denke ich poste einfach mal den Code:
while 1:
print('Widerstand berechnen: geben sie die Daten ein')
print('(Kommas als .)')
betriebsspannung = float(input('Betriebsspannung in Volt:'))
durchlassspannung = float(input('Durchlassspannung in Volt:'))
i = float(input('Stromstärke in Ampere:'))
if betriebsspannung <= durchlassspannung:
print('<Error: Betriebsspannung muss größer sein als Durchlassspannung>')
#hier soll von vorne angefangen werden
u = betriebsspannung - durchlassspannung
r = u/i
print('Der Widerstand beträgt %s Ohm' % r)
print(2*'\n')
Display More
Es sollte ein Programm werden, mit dem man Vorwiderstände berechnen kann. Und weil ich halt Lust dazu hatte, wollte ich etwas hinzufügen, was verhindert dass mir beim Widerstand minus-Zahlen ausgeworfen werden.
Wahrscheinlich ist die Lösung offensichtlich, nur das ich nicht drauf komme :longline:
Danke für eure Hilfe
Kaptain
Da reicht ein else in Zeile 9 und Zeile 10-13 eingerueckt
while 1:
print('Widerstand berechnen: geben sie die Daten ein')
print('(Kommas als .)')
betriebsspannung = float(input('Betriebsspannung in Volt:'))
durchlassspannung = float(input('Durchlassspannung in Volt:'))
i = float(input('Stromstärke in Ampere:'))
if betriebsspannung <= durchlassspannung:
print('<Error: Betriebsspannung muss größer sein als Durchlassspannung>')
continue
u = betriebsspannung - durchlassspannung
r = u/i
print('Der Widerstand beträgt %s Ohm' % r)
print(2*'\n')
Display More
Tell Ich persoenlich empfinde ein continue auch als ein kleines goto und praeferiere deshalb ein else
framp Die while-Schleife benutzt intern auch ein goto
Also ohne while, for, if, else und Funktionen codieren?
Intern wird natuerlich alles auf Assemblerebene mit gotos gehandhabt. Nur sollten gotos auf der hoeheren Programmiersprache nicht mehr sichtbar sein. Ich finde ein if ... else ist einfach besser zu lesen als ein if ... continue. Ist aber mein persoenlicher Geschmack und wir muessen darueber wohl auch kaum diskutieren und den TE verwirren.
KaptainAhoibrause Beides sind Loesungen und ich persoenlich finde die mit else besser da leichter lesbar. Einrueckungen ueberliest man nicht - aber ein kleines continue durchaus. Tell findet die mit continue besser. Du kannst Dich entscheiden welche Loesung Dir besser gefaellt
Don’t have an account yet? Register yourself now and be a part of our community!