Subprocess und das Quoting: Wie macht man's richtig?

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
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Wie wir alle wissen, übergibt man ``subprocess`` die Argumente für den aufzurufenden Prozess als Elemente einer Liste. Aus ``'ls -l blupp'`` wird ``['ls', '-l', 'blupp']``. So weit, so gut. Aber wie sieht es hiermit aus:

Code: Alles auswählen

In [164]: subprocess.call(['/usr/bin/touch', '"ein', 'test"'])
Wenn ich streng an den Leerzeichen trenne, muss ich das so machen. Das Ergebnis ist aber eigentlich nicht, was ich wollte:

Code: Alles auswählen

In [165]: subprocess.call(['/bin/ls', '-l', '"ein', 'test"'])
-rw-r--r-- 1 sebastian sebastian 0  2. Mär 22:58 "ein
-rw-r--r-- 1 sebastian sebastian 0  2. Mär 22:58 test"
Es bleibt einem also bei solchen Quotings nichts anderes übrig als (in dem Fall) den kompletten Dateinamen als ein Argument zu übergeben, sehe ich das richtig? Und macht das die Sache irgendwie unsicherer?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

snafu hat geschrieben:Es bleibt einem also bei solchen Quotings nichts anderes übrig als (in dem Fall) den kompletten Dateinamen als ein Argument zu übergeben, sehe ich das richtig?
Natürlich, das gehört ja auch so. Die Liste ist genau das was dann auf der anderen Seite als ``argv`` bzw. ``sys.argv`` ankommt. Das Splitten der Argumente sollte ja die logischen Argumente berücksichtigen. Primitiv an Leerzeichen splitten könnte Python ja selbst.

Überleg doch wie man es in einer Shell macht. Dort gibt man einen Dateinamen mit Leerzeichen in Quotes an, eben damit die Shell weiß, das das 1 (!) Argument ist und nicht zwei separate.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ja, stimmt. Macht ja auch Sinn...
Antworten