Piszę skrypt w języku Python, który akceptuje ścieżki plików jako łańcuchy, analizuje je, dodaje nazwę polecenia i buduje listę, która następnie jest przekazywana do wykonania przez subprocess.Popen()
. Skrypt ten obsługuje zarówno ścieżki plików Unix, jak i Windows, a docelowo powinien działać w obu systemach.Jak zapobiec automatycznym zmianom znaków specjalnych w Pythonie
Po uruchomieniu tego w systemie Unix, jeśli podam ścieżkę systemu Windows, która nieumyślnie zawiera znak escape (np. \Users\Administrator\bin
), Python zinterpretuje osadzoną \b
jako znak Backspace. Chcę temu zapobiec.
O ile mi wiadomo, nie ma funkcji lub metody oznaczania zmiennej łańcuchowej jako nieprzetworzonego łańcucha. Modyfikator 'r'
działa tylko dla stałych łańcuchowych.
Dotychczas najbliżej byłem w stanie uzyskać to:
winpath = "C:\Users\Administrator\bin"
winpath = winpath.replace('\b','\\b')
winpathlist = winpath.split('\\')
W tym momencie powinno winpathlist zawierać ['C:','Users','Administrator','bin']
, nie ['C','Users','Administrator\x08in']
.
mogę dodać dodatkowe połączenia do winpath.replace()
do obsługi innych ucieczek mogę dojechać - \a
, \f
, \n
, \r
, \t
, \v
- ale nie \x
.
Czy jest to bardziej pythonic sposób to zrobić?
Jak otrzymujesz wartość do ciągu? Python nie powinien traktować \ b jako ucieczki, chyba że jest w literale łańcuchowym, lub wchodzi do łańcucha jako ucieczka na początek. (Również ukośniki działają dobrze.) – geoffspear
@Wooble: W tej chwili przychodzi za pośrednictwem doctest. >>> myCommandObject.setExcecutablePath ("C: \ Program Files \ cygwin \ cdrive \ bin") gdzie myCommandObject zawiera nazwę polecenia (np. "ps"), ścieżkę i listę argumentów. Zmiana ukośników z ukośników odwrotnych na ukośniki nie jest opcją; mój klient wyraźnie stwierdził, że tego właśnie chciał. – poltr1
Jak już powiedziałem, r działa tylko dla literałów ciągowych; nie działa dla zmiennych łańcuchowych. Patrzę na prowadzący r jako kluczyk. W każdym razie, oto doctest (lub jego część): >>> myCommand.setExecutablePath ('C: \ Program Files \ cygwin \ cdrive \ bin') >>> myCommandList = myCommand.getLaunchList() >> > myCommandList ['C: \\\\ Program Files \\\\ cygwin \\\\ cdrive \\\\ bin \\\\ ps', '-e', '-f'] >>> myCommandList [0] .split ("\\\\") ['C:', 'Program Files', 'cygwin', 'cdrive', 'bin', 'ps'] Nie otrzymuję już żadnych błędy, teraz dodałem wezwanie do zastąpienia. – poltr1