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:
import sys
sys.path.append('.')
sys.path.append('../DIR2')
import file2
import sys
sys.path.append( '.' )
sys.path.append( '../DIR2' )
MY_FILE = "myfile.txt"
myfile = open(MY_FILE)
some text
Maintenant, il y a deux scénarios. Le premier fonctionne, le second donne une erreur.
Je cd
dans DIR2
Et je lance file2.py
Et cela ne pose aucun problème.
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.
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.
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)