2012-09-11 11 views
8

Viene visualizzato un errore "Illegal characters in path" quando si eseguono i comandi chdir in Iron Python. Questo sta accadendo in fase di esecuzione con il mio codice, ma anche nella console Iron Python ha questo problema. Sto usando il modulo nt perché in codice il modulo os non funziona (sembra essere un problema noto).Perché Python (IronPython) segnala "Caratteri non validi nel percorso" quando si utilizza la parola bin?

Facendo un po 'di gioco, i "personaggi illegali" sono in realtà la parola bin. Di seguito è riportato il testo dalla console che mi mostra l'errore solo quando si accede alla directory bin.

Ecco l'esempio

>>> 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. 

cosa è peggio è che io sarò passare a una directory totalmente diverso (che non ha nemmeno una directory bin) e cerco di passare a una "bin" directory e mi otterrò ancora quell'errore!

Qualsiasi idea?

risposta

14

Il separatore di percorso \ è anche un carattere di escape python. li raddoppiare, o meglio ancora, utilizzare r'' letterali pitone prime anziché:

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

Ad esempio, \n è un carattere di nuova riga, e \t viene interpretato come TAB. Nel tuo caso specifico, \b viene interpretato come backspace.

+0

DOH. Lo sapevo che ... Immagino sia successo che fossi riuscito a scappare da tutti quei personaggi particolari eccetto b ..... grazie! – Mike

5

\ è un carattere di escape nelle stringhe Python. \b è backspace, motivo per cui si blocca su \bin: non si specifica la directory Directory\bin, si sta specificando la directory Directory<backspace>in, che non è un percorso legale e anche se lo fosse, non esiste.

È possibile scrivere la stringa raddoppiando i backslash o utilizzando l'indicatore r come suggerito da Martijn. Una terza alternativa è quella di utilizzare semplicemente le barre in avanti come in ogni altro sistema operativo civilizzato. Windows è perfettamente felice di usarli.

+0

+1 per "civilizzato". – lvc

+0

+1 per avermi insegnato che Windows (che fortunatamente posso evitare la maggior parte del tempo) oggi accetta '/' separatori di percorsi come un normale SO. –

+0

Non utilizzo mai il pathing di Windows. In realtà non sto generando i percorsi ma utilizzando la classe .Net Path per creare "percorsi di piattaforma specifici". Quindi ovviamente funzionerà in modo diverso su Windows che su Linux (il mio preferito). Ovviamente si hanno problemi come questo, dove ora devo farlo da piccolo, come si nota chiaramente, Windows non è solo trascinamento delle nodosità, ma solo un orribile sistema operativo in generale. – Mike

1

Windows e la maggior parte degli altri sistemi operativi riconosceranno le barre. Quindi, invece del backslash, double-backslash o r '' (più sulle stringhe letterali here) puoi semplicemente usare le barre in avanti e sei a posto. La risposta here è anche ben dettagliata.

AGGIORNAMENTO: PS: utilizzare le barre retroverse e i valori letterali stringa con cautela. Controlla sempre per il tuo caso specifico. C'è un buon commento su questo in questo answer

+0

Questo in realtà non è vero su Windows in tutte le circostanze. Esistono numerose applicazioni, funzioni all'interno di Windows che richiedono \ per il pathing. Basta aprire un prompt dei comandi, digitare "copia ./directory/file.txt ./locationdir" e vedrai cosa intendo. – Mike

+0

@Mike: hai ragione. Sono assolutamente d'accordo che questo non funziona il 100% delle volte anche in Windows. Pazzo di come nulla sia mai completamente universale quando si tratta di os. cose. Ho anche letto dalla risposta a cui ho collegato nella mia risposta che: "Le stringhe non sono al 100% crude, c'è ancora qualche rudimentale processo di backslash". – Alain

+0

La risposta di cui sopra con "ogni altro sistema operativo civile". Penso si applica. Windows ha un design senza senso che non è buono né per gli utenti, né per gli uomini d'affari, né per gli sviluppatori. Cerco di fare tutto il possibile su Linux per evitare questo genere di cose. Ho bisogno di tenere un conteggio dei luoghi in cui/non è accettato in Windows, perché io e un altro ragazzo ci imbattiamo in questo e ancora e ancora e ancora. – Mike