Hallo!
Ich möchte aus einem String die letzten zwei Buchstaben löschen.
Mit rstrip() kann ich ja nur Whitespaces und Buchstaben, welche ich der
Funktion übergebe, löschen. Da aber die letzten Buchstaben immer
andere sind hilft mir diese Funktion nicht weiter.
Gibt vielleicht eine andere Funktion mit der eine bestimmte Anzahl an
Stellen löschen kann bzw. einen Teilstring auslesen kann?
Gruß
Markus
String kürzen
Wenn s der String ist, ist s[:-2] der um die letzten beiden Buchstaben gekürzte String.
Jörg
Jörg
Hallo Zusammen,
auch wenn der Thread schon über 10 Jahre alt ist habe ich auch ein Problem mit dem String kürzen. Wollte daher keinen neuen Thread eröffnen.
Die Ausgabe funktioniert auch... nur leider wird nicht der Radioname ausgegeben, sondern eine 0.
Lass ich mir das ganze über Print mal anzeigen, sieht es folgendermaßen aus:
Ich weiß leider nicht wie ich die 0 weg bekomme, bzw. soll die neue Zeile weg. Kann mir hier bitte jemand helfen?
Danke
auch wenn der Thread schon über 10 Jahre alt ist habe ich auch ein Problem mit dem String kürzen. Wollte daher keinen neuen Thread eröffnen.
Code: Alles auswählen
def radioname():
str_pad = " " * 16
radioname = os.system("mpc -f %name% current")
radioname = str(radioname)
radioname = str_pad + radioname
print radioname
Lass ich mir das ganze über Print mal anzeigen, sieht es folgendermaßen aus:
Code: Alles auswählen
ANTENNE BAYERN: ANTENNE BAYERN - Wir lieben Bayern, wir lieben die Hits
0
Danke
@wusa
Die ``0``, die Du bekommst ist der Rückgabewert von ``os.system``, das Du nicht mehr benutzen solltest. Verwende stattdessen das ``subprocess`` Modul:
Damit erhältst Du die Ausgabe, die Dein Programm nach ``stdout``, sprich die Konsole, schreibt.
Warum ``str_pad = ' ' * 16``? Dafür gibt es sicherlich eine bessere Möglichkeit. Schau' Dir mal ``str.format`` an.
mutetella
Die ``0``, die Du bekommst ist der Rückgabewert von ``os.system``, das Du nicht mehr benutzen solltest. Verwende stattdessen das ``subprocess`` Modul:
Code: Alles auswählen
>>> import subprocess
>>> command = subprocess.Popen(['echo', 'any output'], stdout=subprocess.PIPE)
>>> out, err = command.communicate()
>>> print out
any output
Warum ``str_pad = ' ' * 16``? Dafür gibt es sicherlich eine bessere Möglichkeit. Schau' Dir mal ``str.format`` an.
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit )
Danke.
Da das ganze über ein 2x16 Display läuft, wird das quasi aufgefüllt und dann über Radioname "durchgeschoben".
Ich werde das heute mal mit dem subprocess testen. Habe da aber leider noch keine Ahnung wie das geht.
Sollte sich aber auch ähnlich lösen lassen?
radioname = subprocess.Popen(["mpc -f %name% current"], stdout=subprocess.PIPE)?
Der ganze Code sieht so aus:
Edit: Gerade mal schnell Google "angeworfen" und habe diese Zeile gefunden.
text1 = subprocess.Popen(['mpc', 'current', '-f', '%artist%'], stdout=subprocess.PIPE).stdout.read().strip()
Mal sehen, ob es heute Abend so klappt.
Da das ganze über ein 2x16 Display läuft, wird das quasi aufgefüllt und dann über Radioname "durchgeschoben".
Ich werde das heute mal mit dem subprocess testen. Habe da aber leider noch keine Ahnung wie das geht.
Sollte sich aber auch ähnlich lösen lassen?
radioname = subprocess.Popen(["mpc -f %name% current"], stdout=subprocess.PIPE)?
Der ganze Code sieht so aus:
Code: Alles auswählen
def radioname():
str_pad = " " * 16
radioname = os.system("mpc -f %name% current")
radioname = str(radioname)
radioname = str_pad + radioname
for i in range (0, len(radioname)):
lcd_byte(DISPLAY_LINE_1, DISPLAY_CMD)
lcd_text = radioname[i:(i+15)]
lcd_string(lcd_text)
time.sleep(0.6)
lcd_byte(DISPLAY_LINE_1, DISPLAY_CMD)
lcd_string(str_pad)
text1 = subprocess.Popen(['mpc', 'current', '-f', '%artist%'], stdout=subprocess.PIPE).stdout.read().strip()
Mal sehen, ob es heute Abend so klappt.
@wusa: Selbst wenn das ”klappt”, dann klappt das nicht wirklich weil das bei jedem Aufruf einen Zombieprozess hinterlassen wird. Man muss von Prozessen den Rückgabecode abfragen, sonst bleibt der in der Prozessliste, auch wenn er beendet ist.
Das ist ja nur ein Programmteil.
Ich rufe mein Radio.py auf und lasse darin eine Schleife laufen.
Ein Teil von der Schleife ist unter anderem die Funktion Radioname()
Da rufe ich doch keinen Prozesse zusätzlich auf?
Und wenn es so sein sollte, kannst du mir sagen wie ich das unterbinde?
Ich rufe mein Radio.py auf und lasse darin eine Schleife laufen.
Ein Teil von der Schleife ist unter anderem die Funktion Radioname()
Da rufe ich doch keinen Prozesse zusätzlich auf?
Und wenn es so sein sollte, kannst du mir sagen wie ich das unterbinde?
@wusa: Ähm, was denkst Du denn was `subprocess.Popen()` macht wenn nicht einen externen Prozess zu starten.
@wusa: Wie schon gesagt Du musst den Rückgabecode von dem Prozess abfragen. Das geht mit der `wait()`-Methode. Oder Du benutzt `subprocess.check_output()`.
@BlackJack
Wenn wusa den Prozess mit ``communicate`` abfragt, so wie ich ihm das empfohlen habe, dann ist dieser doch auch beendet, oder täusche ich mich?
mutetella
Wenn wusa den Prozess mit ``communicate`` abfragt, so wie ich ihm das empfohlen habe, dann ist dieser doch auch beendet, oder täusche ich mich?
Code: Alles auswählen
In [1]: import subprocess
In [2]: command = subprocess.Popen(['ls'], stdout=subprocess.PIPE)
In [3]: !ps -a | less
PID TTY TIME CMD
...
32064 pts/7 00:00:00 ipython
32066 pts/7 00:00:00 ls <defunct>
32068 pts/7 00:00:00 bash
32069 pts/7 00:00:00 ps
32070 pts/7 00:00:00 less
(END)
In [4]: out, err = command.communicate()
In [5]: !ps -a | less
PID TTY TIME CMD
...
32109 pts/7 00:00:00 ipython
32114 pts/7 00:00:00 bash
32115 pts/7 00:00:00 ps
32116 pts/7 00:00:00 less
(END)
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit )
Hallo Zusammen,
ich habe da mal ein paar Fragen zu dem Code von mutetella.
Wenn ich den Code:
bei mir Eingebe, das Programm ausführbar mache und dann ps -a | less aufrufe, kommt folgendes:
Auch wenn ich in einem 2ten "Putty-Fenster" mir "top" anzeigen lasse, wir auch keine Zombie angezeigt.
Mache ich was falsch?
ich habe da mal ein paar Fragen zu dem Code von mutetella.
Wenn ich den Code:
Code: Alles auswählen
import subprocess
command = subprocess.Popen(['ls'], stdout=subprocess.PIPE)
Code: Alles auswählen
!ps -a | less
PID TTY TIME CMD
2266 pts/0 00:00:00 ps
2267 pts/0 00:00:00 less
Auch wenn ich in einem 2ten "Putty-Fenster" mir "top" anzeigen lasse, wir auch keine Zombie angezeigt.
Mache ich was falsch?
@wusa: Die Ausgabe vom ``ls`` wird nicht ausgelesen, dadurch könnte der Aufruf blockieren und damit würde ``ls`` nicht zuende durchlaufen.
Und wenn das tatsächlich der gesamte Code ist und es nicht blockiert, dann endet ja der Python-Prozess und damit werden auch die Kindprozesse beseitigt.
Edit: Wenn man mal ein `time.sleep()` nach dem `Popen()` einfügt, sieht das so aus:
Und wenn das tatsächlich der gesamte Code ist und es nicht blockiert, dann endet ja der Python-Prozess und damit werden auch die Kindprozesse beseitigt.
Edit: Wenn man mal ein `time.sleep()` nach dem `Popen()` einfügt, sieht das so aus:
Code: Alles auswählen
bj@god:~$ ps
PID TTY TIME CMD
7510 pts/5 00:00:00 python
7511 pts/5 00:00:00 ls <defunct>
7512 pts/5 00:00:00 ps
Sorry für das blöde Nachfragen, aber ich verstehe es nicht.
Bringt folgende Ausgabe:
Code: Alles auswählen
import subprocess
import time
command = subprocess.Popen(['ls'], stdout=subprocess.PIPE)
time.sleep(1)
Code: Alles auswählen
PID TTY TIME CMD
2234 pts/0 00:00:01 bash
2345 pts/0 00:00:00 ps
@wusa: Du hast das ``ps`` auch ausgeführt *während* das andere Programm noch lief? Deswegen ist das `sleep()` da ja drin, damit man die Chance hat das zu sehen bevor das Skript zuende ist.
Ich habe "ps" nicht während "sleep()" aufgerufen!
Ich verstehe es leider nicht.
Wenn ich die paar Zeilen ausführe und dann KEINEN Rückgabewert erhalte, dann wurde doch der Prozess vermutlich auch wieder ordnungsgemäß beendet? Oder sehe ich das falsch?
Sonst müsste doch ein Prozesse bei "ps" auftauchen?
Ich hinterfrage das ganze leider nur, da ich es nicht verstehe. Sicherlich hat es auch was mit sauberer Programmierung zu tun.
Da aber bei der Ausgabe von "ps" nichts auftaucht, nach dem "sleep()" schließe ich daraus, dass hier nichts hängen bleibt?
Vorab schon mal Danke! für die Hilfe und evlt. auch die Geduld
Ich verstehe es leider nicht.
Wenn ich die paar Zeilen ausführe und dann KEINEN Rückgabewert erhalte, dann wurde doch der Prozess vermutlich auch wieder ordnungsgemäß beendet? Oder sehe ich das falsch?
Sonst müsste doch ein Prozesse bei "ps" auftauchen?
Ich hinterfrage das ganze leider nur, da ich es nicht verstehe. Sicherlich hat es auch was mit sauberer Programmierung zu tun.
Da aber bei der Ausgabe von "ps" nichts auftaucht, nach dem "sleep()" schließe ich daraus, dass hier nichts hängen bleibt?
Vorab schon mal Danke! für die Hilfe und evlt. auch die Geduld