2010-04-22 14 views
6

Są czasy, w których automagicznie tworzę małe skrypty powłoki z Pythona i chcę się upewnić, że argumenty nazwy pliku nie zawierają znaków specjalnych bez znaków specjalnych. Wprowadziłem własne rozwiązanie, które podam jako odpowiedź, ale jestem prawie pewien, że widziałem taką funkcję utraconą gdzieś w standardowej bibliotece. Przez "utracone" rozumiem, że nie znalazłem go w oczywistym module, takim jak shlex, lub subprocess.Zacytuj znaki specjalne powłoki POSIX w wyjściu w języku Python

Czy znasz taką funkcję w stdlib? Jeśli tak, gdzie to jest?

Nawet negatywna (ale określona i poprawna :) odpowiedź zostanie zaakceptowana.

+1

możliwy duplikat [Jaki jest najlepszy sposób na uniknięcie wywołań os.system() w Pythonie?] (Http://stackoverflow.com/questions/35817/whats-the-best-way-to-escape-os- system-calls-in-python) - Nawet jeśli drugi mówi o systemie os.system, a to nie jest, jest to ten sam cytat w tym samym celu. I ma te same odpowiedzi. –

Odpowiedz

6

pipes.quote():

>>> from pipes import quote 
>>> quote("""some'horrible"string\with lots of junk!$$!""") 
'"some\'horrible\\"string\\\\with lots of junk!\\$\\$!"' 

Chociaż należy zauważyć, że jest to prawdopodobnie ma błąd, a zero długości arg powróci nic:

>>> quote("") 
'' 

Prawdopodobnie byłoby lepiej, gdyby wrócił '""'.

+0

Tak, dziękuję! I to jest w oczywistym module (dla użytkownika POSIX), więc się pomyliłem. – tzot

+0

Czasem użyteczne jest również 'subprocess.list2cmdline'; robi * nie * urywa metacentrów powłoki, ale obsługuje wychodzenie z cytowania i zamykania przestrzeni, więc jest całkiem niezłe, gdy * chcesz * wywoływać zdalną powłokę, ale przechodzi przez jedną lub więcej dodatkowych warstw odsuwania po drodze, np. przez 'ssh' wywołanie komendy zdalnej. –

1

Funkcja używam to:

def quote_filename(filename): 
    return '"%s"' % (
     filename 
     .replace('\\', '\\\\') 
     .replace('"', '\"') 
     .replace('$', '\$') 
     .replace('`', '\`') 
    ) 

czyli: ja zawsze ująć nazwę pliku w cudzysłów, a następnie zacytować tylko znaki specjalne wewnątrz podwójnych cudzysłowów.

+0

Czy to nie irytujące, gdy zadajesz pytanie tylko po to, by odpowiedzieć na to pytanie? : P (Zdarzyło mi się to również niedawno.) –

+0

@Roger: Hell. Mechanizm wyszukiwania SO wymaga ulepszeń. * * * Szukałem odpowiedzi, zanim zadaję pytanie. Zauważ, że moja odpowiedź nigdy nie miała być wybrana jako * odpowiedź *. Głosowałem również za zamknięciem tego pytania. – tzot

+0

[Rzeczywiście tak.] (Http://meta.stackexchange.com/questions/42878/show-related-questions-just-before-question-submission) Nie starałem się powiedzieć nic złego o tym, że pytasz pytanie (może nawet być trudne do przeszukania, aż po wszystkich procesach myślowych, które zaczęły się pisać i publikować), próbując podzielić się frustracją. –