String kürzen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
macpes
User
Beiträge: 7
Registriert: Dienstag 13. Mai 2003, 08:24

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
joerg
User
Beiträge: 188
Registriert: Samstag 17. August 2002, 17:48
Wohnort: Berlin
Kontaktdaten:

Wenn s der String ist, ist s[:-2] der um die letzten beiden Buchstaben gekürzte String.

Jörg
macpes
User
Beiträge: 7
Registriert: Dienstag 13. Mai 2003, 08:24

Danke!

Genau das habe ich gesucht. :D

Gruß
Markus
wusa
User
Beiträge: 40
Registriert: Dienstag 18. Februar 2014, 11:08

Hallo Zusammen,

auch wenn der Thread schon über 10 Jahre alt ist :shock: 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
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:

Code: Alles auswählen

ANTENNE BAYERN: ANTENNE BAYERN - Wir lieben Bayern, wir lieben die Hits
0
Ich weiß leider nicht wie ich die 0 weg bekomme, bzw. soll die neue Zeile weg. Kann mir hier bitte jemand helfen?

Danke
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@wusa
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
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
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
wusa
User
Beiträge: 40
Registriert: Dienstag 18. Februar 2014, 11:08

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:

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)
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.
BlackJack

@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.
wusa
User
Beiträge: 40
Registriert: Dienstag 18. Februar 2014, 11:08

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?
BlackJack

@wusa: Ähm, was denkst Du denn was `subprocess.Popen()` macht wenn nicht einen externen Prozess zu starten. ;-)
wusa
User
Beiträge: 40
Registriert: Dienstag 18. Februar 2014, 11:08

Ou :|

Selbst über die eigenen Füße gefallen.
Aber wie kann ich dann so etwas verhindern?
Wenn die Prozessliste vollläuft, dann denke ich wird es über kurz oder lang auf die Auslastung von dem ganzen Pi gehen?
BlackJack

@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()`.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@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?

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)
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
BlackJack

@mutetella: Ja die Methode führt am Ende ein `wait()` aus.
wusa
User
Beiträge: 40
Registriert: Dienstag 18. Februar 2014, 11:08

Vielen Dank für die Antworten. Ich habe gestern schon den Tipp mit "subprocess" umgesetzt.
Heute werde ich mich dann noch an diese Methode setzten.
wusa
User
Beiträge: 40
Registriert: Dienstag 18. Februar 2014, 11:08

Hallo Zusammen,

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)
bei mir Eingebe, das Programm ausführbar mache und dann ps -a | less aufrufe, kommt folgendes:

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?
BlackJack

@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:

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
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@wusa: wenn ein Programm beendet wird, wird der init-Prozess automatisch Vater aller Kindprozesse, und init räumt Zombies sofort ab.
wusa
User
Beiträge: 40
Registriert: Dienstag 18. Februar 2014, 11:08

Sorry für das blöde Nachfragen, aber ich verstehe es nicht.

Code: Alles auswählen


import subprocess
import time
command = subprocess.Popen(['ls'], stdout=subprocess.PIPE)
time.sleep(1)


Bringt folgende Ausgabe:

Code: Alles auswählen

 PID TTY          TIME CMD
 2234 pts/0    00:00:01 bash
 2345 pts/0    00:00:00 ps

BlackJack

@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.
wusa
User
Beiträge: 40
Registriert: Dienstag 18. Februar 2014, 11:08

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 ;)
Antworten