web-dev-qa-db-fra.com

Python: OSError: [Errno 2] Aucun fichier ou répertoire de ce type: ''

J'ai 100 lignes, 3 ans python grattoir qui bug maintenant. Les lignes de départ sont:

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!)

Lors de l'exécution,

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

Je reçois l'erreur:

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: ''

Comment lire cette erreur et que faire?

17
Hugolpz

Avez-vous remarqué que vous ne recevez pas l'erreur si vous exécutez

python ./script.py

au lieu de

python script.py

Ceci est dû au fait sys.argv[0] Je vais le lire ./script.py dans le premier cas, ce qui donne os.path.dirname quelque chose avec lequel travailler. Lorsque vous ne spécifiez pas de chemin, sys.argv[0] lit simplement script.py, et os.path.dirname ne peut pas déterminer un chemin.

31
zigg

J'ai eu cette erreur car je fournissais une chaîne d'arguments à subprocess.call au lieu d'un tableau d'arguments. Pour éviter cela, utilisez shlex.split:

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

Utilisez os.path.abspath():

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

sys.argv[0] Dans votre cas est juste un nom de script, pas de répertoire, donc os.path.dirname() renvoie une chaîne vide.

os.path.abspath() transforme cela en un chemin absolu correct avec le nom du répertoire.

19
Martijn Pieters