2012-09-11 18 views
8

Otrzymuję komunikat "Niedozwolone znaki w ścieżce" podczas wykonywania komend chdir w elemencie Iron Python. Dzieje się to w czasie wykonywania z moim kodem, ale nawet w konsoli Iron Python ma ten problem. Używam modułu nt, ponieważ w kodzie moduł os nie działa (wydaje się być znanym problemem).Dlaczego Python (IronPython) zgłasza "Niedozwolone znaki na ścieżce", gdy używany jest wyraz "bin"?

Trochę się bawiąc, okazuje się, że "nielegalne znaki" to w rzeczywistości słowo "bin". Poniżej znajduje się tekst z konsoli, który pokazuje, że otrzymuję błąd tylko po przejściu do katalogu bin.

Oto przykład

>>> nt.chdir('c:\Users\xxxxx\Documents\Visual Studio 2010\Projects\xxx') 
>>> nt.chdir('c:\Users\xxxxx\Documents\Visual Studio 2010\Projects\xxx\Directory') 
>>> nt.chdir('c:\Users\xxxxx\Documents\Visual Studio 2010\Projects\xxx\Directory\bin') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: Illegal characters in path. 

Co gorsza będę poruszać się do zupełnie innego katalogu (który nawet nie ma katalogu bin) i spróbuj przejść do podkatalogu „bin” i ja Nadal dostaję ten błąd!

Jakieś pomysły?

Odpowiedz

14

Separator ścieżek \ jest również znakiem ucieczki Pythona. Podwoić ich, albo jeszcze lepiej, użyj r'' surowych literałów Pythona zamiast:

r'c:\Users\xxxxx\Documents\Visual Studio 2010\Projects\xxx' 
'c:\\Users\\xxxxx\\Documents\\Visual Studio 2010\\Projects\\xxx' 

Na przykład \n jest znak nowej linii, a \t jest interpretowany jako zakładki. W konkretnym przypadku \b jest interpretowany jako backspace.

+0

DOH. Wiedziałem, że ... Domyślam się, że tak się składa, że ​​wszystko było w porządku, uciekając przed tymi wszystkimi znakami oprócz b ..... dzięki! – Mike

5

\ to znak ucieczki w łańcuchach Pythona. \b jest backspace, dlatego jest to barf na \bin: nie określasz katalogu Directory\bin, określasz katalog Directory<backspace>in, który nie jest ścieżką prawną, a nawet jeśli był, nie istnieje.

Możesz napisać ciąg przez podwojenie ukośników lub użycie wskaźnika r zgodnie z sugestią Martijn. Trzecią alternatywą jest użycie po prostu ukośników, jak w każdym innym cywilizowanym systemie operacyjnym. Windows jest całkowicie zadowolony z ich używania.

+0

+1 dla "cywilizowanych". – lvc

+0

+1 za uczenie mnie, że okna (które z radością mogę uniknąć przez większość czasu) obecnie akceptują separatory ścieżek "/", takie jak normalny system operacyjny. –

+0

Sam nigdy nie używam ścieżki Windows. Właściwie to sam nie generuję ścieżek, ale używam klasy .Net Path do tworzenia "platformowych ścieżek specyficznych". Tak więc inaczej będzie działać na Windowsie niż Linuksie (moim preferowanym). Oczywiście pojawiają się takie problemy, w których muszę teraz przejść przez dziecko, jak wyraźnie zaznaczasz, Windows nie jest tylko przeciąganiem palców, ale po prostu strasznym os w ogóle. – Mike

1

System Windows i większość innych systemów operacyjnych rozpoznaje ukośniki w przód. Tak więc, zamiast odwrotnego ukośnika, podwójnego ukośnika odwrotnego lub r "(więcej w literałach strunowych here) można po prostu użyć ukośników w przód i dobrze jest jechać. Odpowiedź here jest również szczegółowa.

AKTUALIZACJA: PS: Używaj odwróconych ukośników i literałów ciągów z rozwagą. Zawsze sprawdzaj swoją konkretną sprawę. Jest dobry komentarz na ten temat w tym answer

+0

To nie jest prawdą w systemie Windows we wszystkich okolicznościach. Istnieje wiele aplikacji, funkcji w oknach wymagających \ dla ścieżki. Po prostu otwórz wiersz polecenia, wpisz "copy ./directory/file.txt ./locationdir", a zobaczysz co mam na myśli. – Mike

+0

@Mike: Zdecydowanie masz rację. Zdecydowanie zgadzam się, że to nie działa w 100%, nawet w Windows. Szalony, jak nic nie jest całkowicie uniwersalne, jeśli chodzi o os. rzeczy. Czytałem również z odpowiedzi, do której odsyłałem w mojej odpowiedzi, że: "Tak nieprzetworzone ciągi nie są w 100% nieprzetworzone, wciąż istnieje pewne podstawowe przetwarzanie odwrotne-ukośne". – Alain

+0

Powyższa odpowiedź z "każdym innym cywilizowanym systemem operacyjnym". Myślę, że dotyczy. Windows ma nonsensowną konstrukcję, która nie jest ani dobra dla użytkowników, przedsiębiorców, ani programistów. Staram się rozwijać tak dużo Linuksa, jak tylko mogę, aby tego uniknąć. Muszę zachować liczbę miejsc, gdzie/nie jest akceptowana w oknach, ponieważ inny facet i ja spotykamy się z tym raz za razem. – Mike

Powiązane problemy