wie löse ich das Problem der escape characters bei Übergabeparameter in Python?

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
JKR
User
Beiträge: 5
Registriert: Freitag 8. September 2023, 11:28

Hi,

wenn ich bestimmte Zeichen als Übergabeparameter verwende, wendet Python seine Logik für escape Characters an - was ich aber nicht will !

Mein Bsp. skript parameter: "C:\Ordner 1\" "D:\test 2\"

Code: Alles auswählen

import sys
if len(sys.argv) > 1:    
    print(sys.argv[1])
    print(sys.argv[2])
Als Ergebnis bekomme ich dann ...
C:\Users\Jkr\AppData\Local\Programs\Python\Python37-32\python.exe E:/test.py "C:\Ordner 1\" D:\test" 2\"
C:\Ordner 1" D:\test
2"

Wie man sieht "zerreißt" es die beiden argumente an der falschen stelle ... weil es sollte folgendes kommen:
C:\Ordner 1\
D:\test 2\

Python soll mir einfach die Strings die ich ihm als Übergabeparameter gebe unverändert weiterreichen - ohne ev. escape characters zu berücksichtigen !
Zuletzt geändert von JKR am Freitag 8. September 2023, 12:05, insgesamt 1-mal geändert.
Sirius3
User
Beiträge: 18226
Registriert: Sonntag 21. Oktober 2012, 17:20

Du zeigst den falschen Code. Das Problem liegt ja an der Stelle, an der Du dieses Skript aufrufst.

Wenn Du per subprocess ein anderes Python-Programm aufrufst, machst Du eh wahrscheinlich etwas falsch, da es einfacher ist, etwas als Modul zu importieren und direkt aufzurufen.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Tut es auch nicht. Escaping hat NICHTS mit string-Objekten zu tun, sondern bezieht sich *ausschliesslich* auf Stringliterale, also das Vorkommen von in Anführungszeichen gesetzten Zeichenketten im Programmtext. Python verändert also nichts an sys.argv, sondern überführt exakt die im C-main-call definierten argv/argv-Argumente in strings, ohne Wandlung (jenseits eines Dekodierens von Bytes zu einem String, da passiert aber auch kein Escaping).

Der Übeltäter hier ist außerhalb. Ich vermute er sitzt vorm Keyboard und die Argumente falsch angegeben. Dazu müsste man den exakten Aufruf in der Shell sehen. Hier wäre sogar mal ausnahmsweise ein Screenshot angebracht.
Benutzeravatar
Dennis89
User
Beiträge: 1506
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

wenn ich hier unter Fedora das Skript im Terminal laufen lasse, dann bekomme ich die gleiche Ausgabe:

Code: Alles auswählen

[dennis@dennis ~]$ python skript.py "C:\Ordner 1\" "D:\test 2\"
C:\Ordner 1" D:test
2"
Wenn ich aber die " in ' ersetze, dann gehts:

Code: Alles auswählen

[dennis@dennis ~]$ python skript.py 'C:\Ordner 1\' 'D:\test 2\'
C:\Ordner 1\
D:\test 2\
Gibt es dafür eine Erklärung?

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
JKR
User
Beiträge: 5
Registriert: Freitag 8. September 2023, 11:28

__deets__ hat geschrieben: Freitag 8. September 2023, 11:55 Tut es auch nicht. Escaping hat NICHTS mit string-Objekten zu tun, sondern bezieht sich *ausschliesslich* auf Stringliterale, also das Vorkommen von in Anführungszeichen gesetzten Zeichenketten im Programmtext. Python verändert also nichts an sys.argv, sondern überführt exakt die im C-main-call definierten argv/argv-Argumente in strings, ohne Wandlung (jenseits eines Dekodierens von Bytes zu einem String, da passiert aber auch kein Escaping).

Der Übeltäter hier ist außerhalb. Ich vermute er sitzt vorm Keyboard und die Argumente falsch angegeben. Dazu müsste man den exakten Aufruf in der Shell sehen. Hier wäre sogar mal ausnahmsweise ein Screenshot angebracht.
Ich habe das Programm etwas abgeändert um besser zu zeigen wo mein Problem liegt ... hoffe es ist jetzt verständlicher ... den zweiten Übergabeparameter möchte ich verwenden - und dieser sollte bei der Ausgabe sein:
D:\test 2\

Code: Alles auswählen

import sys
if len(sys.argv) > 1:
    mein_pfad_2 = sys.argv[2]
    print(mein_pfad_2)
Das Ergebnis ist dann:
2"

Leider konnte ich keine Screenshots mehr dazu geben ... kann meinen Post nicht mehr editieren und in den Antworten finde ich keine Funktion um welche hochzuladen :(
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Screenshots muss man ueber imgur zB anlegen, und dann hier verlinken.

Und dein Problem ist schon verstanden worden. Es stimmt eben nur nicht, was du da schlussfolgerst. Python's Escaping kommt dir hier nicht in die quere, der Fehler liegt beim Aufruf.
narpfel
User
Beiträge: 688
Registriert: Freitag 20. Oktober 2017, 16:10

__deets__ hat richtig geraten: Der Aufruf in der Shell ist falsch. `\"` ist für die Shell ein escapetes Anführungszeichen und nicht das Ende des Strings. Am einfachsten wäre wohl, einfach forward slashes zu benutzen. Oder du musst recherchieren, wie Escapes in deiner Shell funktionieren und das dementsprechend richtig machen.
JKR
User
Beiträge: 5
Registriert: Freitag 8. September 2023, 11:28

Dennis89 hat geschrieben: Freitag 8. September 2023, 12:05 Hallo,

wenn ich hier unter Fedora das Skript im Terminal laufen lasse, dann bekomme ich die gleiche Ausgabe:

Code: Alles auswählen

[dennis@dennis ~]$ python skript.py "C:\Ordner 1\" "D:\test 2\"
C:\Ordner 1" D:test
2"
Wenn ich aber die " in ' ersetze, dann gehts:

Code: Alles auswählen

[dennis@dennis ~]$ python skript.py 'C:\Ordner 1\' 'D:\test 2\'
C:\Ordner 1\
D:\test 2\
Gibt es dafür eine Erklärung?

Grüße
Dennis

Ich verwende eine Windows Maschine ... da ist es leider egal welches Hochkomma - einfach oder doppelt - ich verwende, bekomme immer das falsche :?

Meinen Besten Dank auch an @Dennis89 dass du mein Programm ausprobiert hast ! thx a lot !!!!
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

imonbln hat's schon gesagt: du escapest *IN DER SHELL* ein schliessendes Hochkomma, indem du schreibst

Code: Alles auswählen

"C:\ein\pfad\" dann kommt was anderes  und irgendwann das schliessende hochkomma"
Das \" ist NICHT der Pfadtrenner, gefolgt vom Ende des Strings. Sondern eben - escaped - ein ". Die Shell macht also das naechste Argument erst spaeter "auf".
JKR
User
Beiträge: 5
Registriert: Freitag 8. September 2023, 11:28

__deets__ hat geschrieben: Freitag 8. September 2023, 12:34 Screenshots muss man ueber imgur zB anlegen, und dann hier verlinken.

Und dein Problem ist schon verstanden worden. Es stimmt eben nur nicht, was du da schlussfolgerst. Python's Escaping kommt dir hier nicht in die quere, der Fehler liegt beim Aufruf.
Tja, wie schön dass das endlich mal einer verständlich ausgedrückt hat - an das hab ich gar nicht gedacht dass die shell Schuld is :(
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

JKR hat geschrieben: Freitag 8. September 2023, 12:54 Tja, wie schön dass das endlich mal einer verständlich ausgedrückt hat - an das hab ich gar nicht gedacht dass die shell Schuld is :(
Ist das dein Ernst? Das habe ich in meiner ersten Antwort schon nahegelegt.. da darfst du dir durchaus mal selbst an den Kopp packen, wann hier "endlich" was passiert ist.
JKR
User
Beiträge: 5
Registriert: Freitag 8. September 2023, 11:28

__deets__ hat geschrieben: Freitag 8. September 2023, 13:00
JKR hat geschrieben: Freitag 8. September 2023, 12:54 Tja, wie schön dass das endlich mal einer verständlich ausgedrückt hat - an das hab ich gar nicht gedacht dass die shell Schuld is :(
Ist das dein Ernst? Das habe ich in meiner ersten Antwort schon nahegelegt.. da darfst du dir durchaus mal selbst an den Kopp packen, wann hier "endlich" was passiert ist.
:lol: :lol: :lol:
Du hast mich in deiner ersten Antwort nur beleidigt! :( "... Der Übeltäter hier ist außerhalb. Ich vermute er sitzt vorm Keyboard und die Argumente falsch angegeben. ... "
Das es an der Konsole liegt hast du mit keinem Wort erwähnt!
Es ist schon bedauerlich, dass ich so wenig weiss und der größte Übeltäter vor meinem Keyboard bin, aber sehr viel mehr bedauerlicher ist es, wenn Menschen wie du andere beleidigen!!!
Fühlst du dich dann besser? Weil du der Schlauste bist?
Warum beantwortest du Fragen, wenn diese - oder vielmehr die Fragestellenden - so unter deiner Würde sind? :o Dank mal darüber nach!
So ein Benehmen ist total Aggro und Assozial! :x Übrigens geht das auch aus deinen anderen Beiträgen hervor.
Wenn du ein Problem mit anderen Menschen hast, dann such dir bitte Hilfe!
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

In meiner ersten Antwort habe ich als wahrscheinlichste Ursache die Shell benannt. Du selbst sagst "an das hab ich gar nicht gedacht dass die shell Schuld is" - also habe ich das sehr wohl erwaehnt, du hast schlicht nicht wirklich gelesen, was dir hier geschrieben wurde. Du redest also Schwachsinn, wenn du schreibst " Das es an der Konsole liegt hast du mit keinem Wort erwähnt!"

Und warum ich Fragen beantworte? Weil ich selbst grundlos getriggerten kleinen Mimosen wie dir, die glauben, es besser zu wissen, Hilfe angedeihen lasse. Was ja auch wunderbar geklappt hat. Dankbarkeit dafuer ist natuerlich Fehlanzeige, stattdessen rumgemotze. Aber ich bin agro und asozial...
Benutzeravatar
DeaD_EyE
User
Beiträge: 1206
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Der Backslash verhindert die Interpretation der Anführungszeichen.
Durch die falsche Argumentübergabe kann das Programm nur diese falsche Ausgabe machen.

Tipp: Einfach / verwenden
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Antworten