Seite 1 von 2

String kürzen

Verfasst: Mittwoch 21. Mai 2003, 14:13
von macpes
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

Re: String kürzen

Verfasst: Mittwoch 21. Mai 2003, 16:04
von joerg
Wenn s der String ist, ist s[:-2] der um die letzten beiden Buchstaben gekürzte String.

Jörg

Danke!

Verfasst: Mittwoch 21. Mai 2003, 18:49
von macpes
Danke!

Genau das habe ich gesucht. :D

Gruß
Markus

Re: String kürzen

Verfasst: Dienstag 13. Januar 2015, 14:56
von wusa
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

Re: String kürzen

Verfasst: Dienstag 13. Januar 2015, 15:38
von mutetella
@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

Re: String kürzen

Verfasst: Dienstag 13. Januar 2015, 16:02
von wusa
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.

Re: String kürzen

Verfasst: Dienstag 13. Januar 2015, 16:26
von 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.

Re: String kürzen

Verfasst: Dienstag 13. Januar 2015, 16:42
von wusa
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?

Re: String kürzen

Verfasst: Dienstag 13. Januar 2015, 16:48
von BlackJack
@wusa: Ähm, was denkst Du denn was `subprocess.Popen()` macht wenn nicht einen externen Prozess zu starten. ;-)

Re: String kürzen

Verfasst: Dienstag 13. Januar 2015, 16:51
von wusa
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?

Re: String kürzen

Verfasst: Dienstag 13. Januar 2015, 19:34
von 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()`.

Re: String kürzen

Verfasst: Mittwoch 14. Januar 2015, 08:14
von mutetella
@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

Re: String kürzen

Verfasst: Mittwoch 14. Januar 2015, 10:26
von BlackJack
@mutetella: Ja die Methode führt am Ende ein `wait()` aus.

Re: String kürzen

Verfasst: Mittwoch 14. Januar 2015, 10:34
von wusa
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.

Re: String kürzen

Verfasst: Sonntag 25. Januar 2015, 17:43
von wusa
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?

Re: String kürzen

Verfasst: Sonntag 25. Januar 2015, 18:00
von 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

Re: String kürzen

Verfasst: Sonntag 25. Januar 2015, 18:16
von Sirius3
@wusa: wenn ein Programm beendet wird, wird der init-Prozess automatisch Vater aller Kindprozesse, und init räumt Zombies sofort ab.

Re: String kürzen

Verfasst: Sonntag 25. Januar 2015, 18:44
von wusa
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


Re: String kürzen

Verfasst: Sonntag 25. Januar 2015, 19:38
von 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.

Re: String kürzen

Verfasst: Montag 26. Januar 2015, 08:24
von wusa
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 ;)