Seite 1 von 1

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

Verfasst: Montag 2. März 2009, 23:08
von snafu
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?

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

Verfasst: Montag 2. März 2009, 23:47
von Leonidas
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.

Verfasst: Dienstag 3. März 2009, 00:04
von snafu
Ja, stimmt. Macht ja auch Sinn...