2013-03-31 15 views
13

Ho un raschietto per pitone di 100 righe, 3 anni che ora è un bug. le linee di partenza sono:Python: OSError: [Errno 2] Nessun file o directory di questo tipo: ''

import urllib, re, os, sys, time # line 1: import modules 
os.chdir(os.path.dirname(sys.argv[0])) # line 2: all works in script's folder > relative address 
# (rest of my script here!) 

Quando viene eseguito,

$cd /my/folder/ 
$python script.py 

ricevo l'errore:

python script.py 
Traceback (most recent call last): 
    File "script.py", line 2, in <module> 
    os.chdir(os.path.dirname(sys.argv[0])) 
OSError: [Errno 2] No such file or directory: '' 

Come dovrei leggere questo errore e cosa fare?

risposta

27

Avete notato che non si ottiene l'errore se si esegue

python ./script.py 

invece di

python script.py 

Questo perché sys.argv[0] leggerà ./script.py nel caso, che le offre qualcosa os.path.dirname lavorare con. Quando non si specifica un percorso, sys.argv[0] legge semplicemente script.py e os.path.dirname non è in grado di determinare un percorso.

+2

Ricevo ancora l'errore. – MontyPython

18

Uso os.path.abspath():

os.chdir(os.path.dirname(os.path.abspath(sys.argv[0]))) 

sys.argv[0] nel tuo caso è solo nome di uno script, non directory, in modo os.path.dirname() restituisce una stringa vuota.

os.path.abspath() trasforma questo in un percorso assoluto corretto con il nome della directory.

+0

Works! grazie a tutti e due! – Hugolpz

+0

Probabilmente rilanciare un thread precedente, ma volevo aggiungere che questa risposta è molto interessante. Ho due script nella stessa cartella, stesse autorizzazioni, entrambi usano 'argparse' e ​​sono eseguibili tramite CLI. Uno non presenta problemi, ma l'altro dà lo stesso errore di "Nessun file o directory". Se utilizzo la tua soluzione, posso eseguire correttamente lo script problematico usando 'python foo.py' ma non da'./Foo.py'. Sono molto curioso di sapere perché questo è –

+0

@KamikazeRusher: lo sarei anche io, ma senza ulteriori dettagli non posso aiutarti. Forse postare questa come una nuova domanda? –

11

Ho avuto questo errore perché stavo fornendo una stringa di argomenti a subprocess.call invece di una matrice di argomenti. Per evitare ciò, utilizzare shlex.split:

import shlex, subprocess 
command_line = "ls -a" 
args = shlex.split(command_line) 
p = subprocess.Popen(args) 
+1

grazie. è necessario in python 2.7 ma non più in python 3 –

Problemi correlati