String nicht auswerten? r voranstellen?

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.
GPD
User
Beiträge: 19
Registriert: Freitag 8. April 2016, 08:22

Hallo,

ich möchte ein externes Programm öffnen und habe folgendes rausgefunden:

Code: Alles auswählen

subprocess.call([r"C:\Programme 64-Bit\matlab.exe"])
Dieser Befehler öffnet die 64-Bit-Version von Matlab.

Nun will ich den String der den Pfad zur Exe-Enthält dynamisch einstellen.

Ich dachte an so was:

Code: Alles auswählen

subprocess.call([rPfad])
Aber wie bekomme ich es hin, dass das Literal "r", was dafür sorgt, dass Escape-Sequenzen nicht ausgewertet (Backslash) mit dazugenommen wird?

Ich habe schon einiges probiert:

Code: Alles auswählen

subprocess.call(["r"+Pfad])

Code: Alles auswählen

subprocess.call(['r'+Pfad])
Leider führt das nur zu Fehlern.

Ich bedanke mich für eure Anregungen!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Das ``r`` benötigst Du nur für *Literale*! Wenn du doch an der Stelle einen Namen an ``call`` übergibst, brauchst Du das ``r`` nicht.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Warum möchtest Du das machen?
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
GPD
User
Beiträge: 19
Registriert: Freitag 8. April 2016, 08:22

Hallo Hyperion,

danke für deine Antwort!

Ich habe dich aber leider noch nicht verstanden. Wenn du sagst, ich brauche keine Literale, dann würde ich folgendes schreiben:

Code: Alles auswählen

subprocess.call(["C:\Programme 64-Bit\matlab.exe"])
Aber genau das funktioniert nicht obe das r. Kannst du mir sagen, was ich falsch gemacht habe?
GPD
User
Beiträge: 19
Registriert: Freitag 8. April 2016, 08:22

mutetella hat geschrieben:Warum möchtest Du das machen?
Hallo mutetella,

ich möchte den Pfad zu einem Programm während der Laufzeit bestimmen. Daher kann ich der Funktion "call" keinen festen String übergeben und einfach ein "r" voranstellen.
BlackJack

@GPD: Du versuchst ein Problem zu lösen das nicht existiert. Escapesequenzen werden nur interpretiert wenn der Compiler Zeichenkettenliterale im Quelltext parst. Wenn Du kein Zeichenkettenliteral als Argument übergibst, dann wird da auch nichts an der nicht-literalen Zeichenkette verändert.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@GPD: das r ist nötig, weil der Python-Compiler Backslash in Stringliteralen als Escapezeichen nimmt. Variablennamen sieht der Compiler einfach als Variablennamen, da macht ein r keinen Sinn:

Code: Alles auswählen

matlab = r"C:\Programme 64-Bit\matlab.exe"
matlab = "C:\\Programme 64-Bit\\matlab.exe"
matlab = os.path.join('C:\\','Programme 64-Bit', 'matlab.exe')
[...]
subprocess.call([matlab])
GPD
User
Beiträge: 19
Registriert: Freitag 8. April 2016, 08:22

Hallo BlackJack,

ich glaube ich verstehe, worauf du und die anderen hinaus wollen. ich habe in

Code: Alles auswählen

subprocess.call(["C:\Programme 64-Bit\matlab.exe"])
keine Escape-Sequenz, also sowas wie \n oder \t. Richtig?

Ok, angenommen, ich hätte nun das Programm Natlab, statt Matlab. Dann sähe mein Befehl so aus:

Code: Alles auswählen

subprocess.call(["C:\Programme 64-Bit\natlab.exe"])
Somit hätt eich ein "\n" im Pfad und das würde zu Problemen führen.
GPD
User
Beiträge: 19
Registriert: Freitag 8. April 2016, 08:22

Sirius3 hat geschrieben:@GPD: das r ist nötig, weil der Python-Compiler Backslash in Stringliteralen als Escapezeichen nimmt. Variablennamen sieht der Compiler einfach als Variablennamen, da macht ein r keinen Sinn:

Code: Alles auswählen

matlab = r"C:\Programme 64-Bit\matlab.exe"
matlab = "C:\\Programme 64-Bit\\matlab.exe"
matlab = os.path.join('C:\\','Programme 64-Bit', 'matlab.exe')
[...]
subprocess.call([matlab])

Hallo Sirius3, danke für deine Hilfe!

Das stimmt, vor einem Variablennamen braucht man kein "r", wenn bereits die Variable mit dem "r" ausgestattet ist.

Aber wie kann ich die Variable "matlab" aus einer String-Variable und dem "r" zusammensetzen?

Ich möchte sowas können:

Code: Alles auswählen

pfadString = "C:\Programme 64-Bit\matlab.exe"
matlab = r + PfadString
Aber das funktioniert leider nicht.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@GPD
Auch nicht.

Code: Alles auswählen

>>> file_ = os.path.join('C:', 'Programme 64-Bit', raw_input())
name_with_\n_newline
>>> file_
'C:\\Programme 64-Bit\\file_with_\\n_newline'
>>> print file_
C:\\Programme 64-Bit\\file_with_\n_newline
Somit gibst Du während der Laufzeit einen Namen an, der auch ein backslash enthalten kann…
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
BlackJack

@GPD: Nein, das funktioniert nicht, Du hast da das r vor dem Zeichenkettenliteral vergessen. Und da musst Du das schreiben wenn eine Escape-Sequenz vorkommt, sonst ist an der Stelle, schon bevor der Code überhaupt läuft, der Wert kaputt. Das lässt sich auch nicht nachträglich robust korrigieren.
GPD
User
Beiträge: 19
Registriert: Freitag 8. April 2016, 08:22

BlackJack hat geschrieben:@GPD: Nein, das funktioniert nicht, Du hast da das r vor dem Zeichenkettenliteral vergessen. Und da musst Du das schreiben wenn eine Escape-Sequenz vorkommt, sonst ist an der Stelle, schon bevor der Code überhaupt läuft, der Wert kaputt. Das lässt sich auch nicht nachträglich robust korrigieren.
Hallo BlackJack,

also gibt es keine Möglichkeit einen Pfad, der als String vorliegt, in einen rohen String umzuwandeln?

Angenommen ich habe folgende Funktion:

Code: Alles auswählen


pfadString = "C:\Programme 64-Bit\matlab.exe" 

def programmStarten(pfadString):
	# hier muss eine Variable mit einem rohen String als Pfad erzeugt werden
	programm = ????
	#
	import subprocess
	subprocess.call([programm])

Sowas geht nicht?
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

GPD hat geschrieben:Sowas geht nicht?
Doch. Hab' ich Dir doch bereits gezeigt.
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
BlackJack

@GPD: Es gibt keine ”rohen Strings” zur Laufzeit. Nochmal: Du versuchst da ein Problem zu lösen, an einer Stelle, an der das nicht existiert. Wenn es dieses Problem tatsächlich gäbe, könntest Du ja mal Quelltext zeigen der das Problem hat. Was hast Du denn konkret anstelle der Fragezeichen im Quelltext stehen und wo glaubst Du damit ein Problem zu haben?
GPD
User
Beiträge: 19
Registriert: Freitag 8. April 2016, 08:22

Hallo an alle,


mein Programm wird insgesamt etwas umfänglicher. Gerafft sieht es so aus:

Code: Alles auswählen

String_Mit_Pfad = pfad_Aus_Excel_Tabelle_Lesen() #liest aus einer Excel-Tabelle einen Pfad zu einer Matlab-Exe und gibt ihn zurück

matlab = aus_String_Pfad_einen_rohen_Pfad_erzeugen(String_Mit_Pfad)

import subprocess
subprocess.call([matlab])
Die Funktion, mit der ich den rohen Pfad generiere wird wohl ungefähr so aussehen (Dank für den Tipp mit os.path.join an mutetella und Sirius3):

Code: Alles auswählen

def aus_String_Pfad_einen_rohen_Pfad_erzeugen(String_Mit_Pfad)
    ordner = ordner_aus_Pfad(String_Mit_Pfad)
    exe = exe_aus_Pfad(String_Mit_Pfad)
    roher_Pfad = os.path.join('C:', ordner, exe)

    return roher_Pfad
Habe ich das elegant gelöst?
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@GPD: viel zu kompliziert.
Einfach:

Code: Alles auswählen

matlab = pfad_Aus_Excel_Tabelle_Lesen()
BlackJack

@GPD: Nein das hast Du nicht elegant gelöst. Das Problem ist also das Du einen Laufwerksbuchstaben voranstellen möchtest. Und was hat *das* jetzt mit irgendwelchen Escapes oder ”rohen” Zeichenketten zu tun? Gar nichts! ``os.path.join(r'C:', String_mit_Pfad)`` ist alles was Du da machst/brauchst
GPD
User
Beiträge: 19
Registriert: Freitag 8. April 2016, 08:22

Also hätte ich bereits beim Einlesen des Pfades ein r voranstellen müssen!

Vielen Dank!!!

Wenn ich das programmiert hab, stell ich den code hier mal rein.
BlackJack

@GPD: Nein! Nochmal: Du vermutest da ein Problem das so einfach nicht existiert. Ein r kann man nur bei literalen Zeichenketten im Quelltext voranstellen. Zeichenketten die Du von irgendwo her einliest sind keine Zeichenketten in Deinem Quelltext.
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Köstlich, ich hoffe der Thread wird dann auch so unterhaltend.
Beim Programmierenn sollte man schon wissen was man warum tut.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Antworten