Je suis sur Jupyter Notebook server (v4.2.2) avec Python 3.4.2 et je veux utiliser le nom global __file__
, car le bloc-notes sera cloné à partir d'autres utilisateurs et dans une section, je dois l'exécuter:
def __init__(self, trainingSamplesFolder='samples', maskFolder='masks'):
self.trainingSamplesFolder = self.__getAbsPath(trainingSamplesFolder)
self.maskFolder = self.__getAbsPath(maskFolder)
def __getAbsPath(self, path):
if os.path.isabs(path):
return path
else:
return os.path.join(os.path.dirname(__file__), path)
La __getAbsPath(self, path)
vérifie si un paramètre path
est un chemin relatif ou absolu et renvoie la version absolue de path
. Je peux donc utiliser la variable path
retournée plus tard, en toute sécurité.
Mais j'ai l'erreur
NameError: name
'__file__'
n'est pas défini
J'ai cherché cette erreur en ligne et j'ai trouvé la "solution" que je devrais mieux utiliser sys.argv[0]
, mais print(sys.argv[0])
est retourné
/usr/local/lib/python3.4/dist-packages/ipykernel/__main__.py
Mais l'emplacement correct du cahier devrait être /home/ubuntu/notebooks/
.
Merci pour la référenceComment obtenir le nom actuel du bloc-notes IPythonde Martijn Pieters (commentaires), la dernière réponse (non acceptée) convient parfaitement à mes besoins:
print(os.getcwd())
/ home/ubuntu/cahiers
Si vous voulez obtenir le chemin du répertoire dans lequel votre script est en cours d'exécution, je vous recommande vivement d'utiliser,
os.path.abspath('')
Avantages
Veuillez noter que l'un des scénarios dans lequel __file__
présente des avantages est lorsque vous appelez python à partir du répertoire A mais que vous exécutez un script dans le répertoire B. Dans ce cas, ainsi que la plupart des autres méthodes renverront A, pas B dossier pour le fichier .ipyn
au lieu du répertoire à partir duquel vous avez lancé jupyter notebook
.
Il n'est pas possible d'obtenir le chemin d'accès au cahier. Vous pouvez trouver un moyen de l'obtenir qui ne fonctionne que dans un seul environnement (par exemple, os.getcwd()
), mais cela ne fonctionnera pas nécessairement si le bloc-notes est chargé d'une manière différente.
Essayez plutôt d’écrire le cahier afin qu’il n’ait pas besoin de connaître son propre chemin. Si vous faites quelque chose comme obtenir le mot de passe, assurez-vous d’échouer rapidement/imprimez une erreur si cela ne fonctionne pas, plutôt que d’essayer en silence de continuer.
Voir aussi: https://github.com/ipython/ipython/issues/10123
Dans Python moderne (v3.4 +), nous pouvons utiliser pathlib pour obtenir le répertoire du cahier:
from pathlib import Path
cwd = Path().resolve()
# cwd == PosixPath('/path/to/this/jupyter/ipynb/file's/directory/')
Mettre à jour
@ShitalShah Je ne peux pas reproduire l'erreur que vous signalez. Le cahier Jupyter semble bien fonctionner, quel que soit le répertoire de travail actuel dans lequel l'application a été démarrée.
Exemple: le fichier ~/dir1/dir2/untitled.ipynb
et le bloc-notes Jupyter ont démarré dans ~/dir1
:
Le cahier Jupyter a démarré dans ~/dir1/dir2
:
__file__
pourrait ne pas être disponible, mais vous pouvez obtenir le dossier actuel dans lequel se trouve votre ordinateur portable de manière différente.
Il y a des traces dans les variables globales. Si vous appelez globals()
, vous verrez qu’il existe un élément avec la clé _dh
qui pourrait vous aider. Voici comment j'ai réussi à charger le fichier data.csv
qui se trouve dans le même dossier que mon ordinateur portable:
import os
current_folder = globals()['_dh'][0]
# Calculating path to the input data
data_location = os.path.join(current_folder,'data.csv')