web-dev-qa-db-fra.com

Comment importer des fichiers dans python en utilisant sys.path.append?

Il y a deux répertoires sur mon bureau, DIR1 Et DIR2 Qui contiennent les fichiers suivants:

DIR1:
file1.py

DIR2:
file2.py  myfile.txt

Les fichiers contiennent les éléments suivants:

file1.py

import sys

sys.path.append('.')
sys.path.append('../DIR2')

import file2

file2.py

import sys

sys.path.append( '.' )
sys.path.append( '../DIR2' )

MY_FILE = "myfile.txt"

myfile = open(MY_FILE) 

monfichier.txt

some text

Maintenant, il y a deux scénarios. Le premier fonctionne, le second donne une erreur.

Scénario 1

Je cd dans DIR2 Et je lance file2.py Et cela ne pose aucun problème.

Scénario 2

Je cd dans DIR1 Et j'exécute file1.py Et cela génère une erreur:

Traceback (most recent call last):
  File "<absolute-path>/DIR1/file1.py", line 6, in <module>
    import file2
  File "../DIR2/file2.py", line 9, in <module>
    myfile = open(MY_FILE)
IOError: [Errno 2] No such file or directory: 'myfile.txt'

Cependant, cela n'a aucun sens pour moi, car j'ai ajouté le chemin d'accès à file1.py En utilisant la commande sys.path.append('../DIR2').

Pourquoi cela se produit-il lorsque file1.py, Lorsque file2.py Se trouve dans le même répertoire que myfile.txt Et qu'il génère une erreur? Je vous remercie.

7
Hunle

Vous pouvez créer un chemin relatif à un module en utilisant l'attribut __file__ D'un module. Par exemple:

myfile = open(os.path.join(
    os.path.dirname(__file__),
    MY_FILE))

Cela devrait faire ce que vous voulez, peu importe où vous commencez votre script.

6
larsks

Remplacer

MY_FILE = "myfile.txt"
myfile = open(MY_FILE) 

avec

MY_FILE = os.path.join("DIR2", "myfile.txt")
myfile = open(MY_FILE) 

C'est ce que les commentaires de votre question appellent la solution de chemin relatif. Cela suppose que vous l'exécutez à partir du dir un de myfile.txt ... donc pas idéal.

Si vous savez que mon_fichier.txt sera toujours dans le même répertoire que file2.py, vous pouvez essayer quelque chose comme ça dans file2 ..

from os import path

fname =  path.abspath(path.join(path.dirname(__file__), "my_file.txt"))
myfile = open(fname)
2
demented hedgehog