Variable in String einfügen

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.
Antworten
liberavia
User
Beiträge: 19
Registriert: Donnerstag 28. August 2008, 12:27

Hallo,

Habe offensichlich eine Einsteigerfrage, die ich mithilfe meines Python-Buches und einer Google-Suche nicht bewältige. Für euch ist das wahrscheinlich ein Klacks ;)

Mir ist nicht klar wieso ich in Python den folgenden Typenfehler erhalte:

Code: Alles auswählen

TypeError: unsupported operand type(s) for %: 'int' and 'tuple'
Hier der betreffende Code:

Code: Alles auswählen

current_call_id = str(fieldentry[1])
current_agentchannel = str(fieldentry[3])
print current_call_id
print current_agentchannel
os.system("asterisk -rx \"core show channel %s\" > /tmp/asterisk-agentchannel-%s") % (current_agentchannel, current_call_id )
agentfile = open("/tmp/asterisk-agentchannel-%s") % (current_call_id)
... usw
Eigentlich wäre die Umwandlung in einen String ja nicht nötig gewesen, da %s das ja implizit tun soll. Die Verzweiflung machts möglich :oops:

Die Werte sind auch nicht Leer. fielentry enstammt einem gesplitteten String und der Code befindet sich in einer Endlosschleife die von der Standardeingabe liest.

Irgendwie hab ich da noch nicht so den Durchblick :roll:

Danke fürs Kopf-Reinwaschen schon mal im Voraus
Die Entscheidung zwischen OpenSource- und proprietärer Software ist die Entscheidung zwischen Evolution und Marketing.
Welches dieser Prinzipien ist Deiner Meinung nach bewährter und nachhaltiger?
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Code: Alles auswählen

os.system("asterisk -rx \"core show channel %s\" > /tmp/asterisk-agentchannel-%s") % (current_agentchannel, current_call_id ) 
os.sytem gibt eine Ganzzahl zurück, daher die Meldung.

Du solltest lieber in den String interpolieren:

Code: Alles auswählen

os.system("asterisk -rx \"core show channel %s\" > /tmp/asterisk-agentchannel-%s" % (current_agentchannel, current_call_id )) 
Und sowieso das Modul subprocess benutzen und nicht os.system.
BlackJack

@liberavia: ``%`` ist ein Operator, wie zum Beispiel ``+``, ``-``, ``*``, oder ``/``. Da steht etwas links davon und etwas rechts davon. Und die jeweiligen Objekte müssen die Operation halt auch unterstützen. ``%`` funktioniert nicht mit `int` und `tuple` und wo wir schon dabei sind, gleich in der nächsten Zeile mit `file` und `tuple` geht das auch nicht:

Code: Alles auswählen

In [6]: 42 % ('foo', 'bar')
---------------------------------------------------------------------------
<type 'exceptions.TypeError'>             Traceback (most recent call last)

/home/bj/<ipython console> in <module>()

<type 'exceptions.TypeError'>: unsupported operand type(s) for %: 'int' and 'tuple'

In [7]: f = open('test.py')

In [8]: f % ('foo', 'bar')
---------------------------------------------------------------------------
<type 'exceptions.TypeError'>             Traceback (most recent call last)

/home/bj/<ipython console> in <module>()

<type 'exceptions.TypeError'>: unsupported operand type(s) for %: 'file' and 'tuple'
liberavia
User
Beiträge: 19
Registriert: Donnerstag 28. August 2008, 12:27

Vielen Dank für die schnellen Antworten :D

Das mit dem Interpolieren hat anscheinend geklappt ;)

Bin noch ein bisschen verwirrt durch die für mich neuen Begriffe wie z. B. Tupel, aber keine sorge ich RTFM ;)

Ich weiß, dass os.system schlechter Stil ist. Wenn subprocess die Alternative ist, dann werd ich mich mal schlau machen. Danke für den Hinweis, denn ich bin selber Froh, wenn ich auf system verzichten kann 8)

Muss aber sagen, dass ich noch nie so eine vielseitige und gleichzeitig elegante Sprache wie Python kennen gelernt habe (Warum blos nicht schon früher :roll: )

Bis zur (sicher) nächsten Frage

Gruß

André
Die Entscheidung zwischen OpenSource- und proprietärer Software ist die Entscheidung zwischen Evolution und Marketing.
Welches dieser Prinzipien ist Deiner Meinung nach bewährter und nachhaltiger?
Antworten