web-dev-qa-db-fra.com

__file__ n'existe pas dans Jupyter Notebook

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

31
Fabian

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

  • Cela fonctionne à partir de Jupyter Notebook
  • Ça marche de REPL
  • Il ne nécessite pas pathlib de Python 3.4

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.

5
Shital Shah

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

12
michael

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:

 Jupyter notebook started in ~/dir1

Le cahier Jupyter a démarré dans ~/dir1/dir2:

 Jupyter notebook started in ~/dir1/dir2

9
mab

__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')
1
shytikov