Skip to content

How to Resolve Python "NameError: name '__file__' is not defined"

Why Python raises NameError: name '__file__' is not defined in REPL or Jupyter Notebooks, and discover 3 reliable solutions to access file paths, including running scripts, using inspect.getfile(), and alternatives for interactive sessions.

When working with Python modules and needing to determine their file path, you might try using the special __file__ attribute. However, attempting to access __file__ directly within an interactive Python session (like the REPL or a Jupyter Notebook cell run independently) results in the NameError: name '__file__' is not defined.

This guide explains why __file__ is not available in interactive sessions and shows the correct ways to access file paths when running scripts or using alternative methods.

Understanding the Error: What is __file__?

__file__ (note the double underscores) is a special, automatically defined global variable that Python creates when a module is imported or a script file is executed. It contains the path to the file from which the module was loaded or the script was run.

It's commonly used with functions from the os.path module to construct paths relative to the script's location, for example, to load data files stored alongside the script.

Cause: Using __file__ in an Interactive Session

The NameError occurs because the concept of a "file path" for the currently executing code doesn't really apply in the same way within an interactive session (like the Python REPL started by typing python or python3 in the terminal, or within a single Jupyter cell without a backing file). The code isn't being loaded from a specific .py file in that context, so Python does not define the __file__ variable.

The standard and intended way to use __file__ is to place your code inside a Python script file (e.g., my_script.py) and then execute that file.

  1. Create a file (e.g., my_script.py):

    import os
    
    print(f"This code is running from:")
    
    script_path = __file__
    print(f"  __file__ is: {script_path}")
    
    script_dir = os.path.dirname(script_path)
    print(f"  Script directory is: {script_dir}")
    
    data_file_path = os.path.join(script_dir, 'data', 'config.txt')
    print(f"  Example data file path: {data_file_path}")
  2. Run the script from your terminal:

    python my_script.py

Example Output (path will vary based on where you save the file):

This code is running from:
  __file__ is: /home/user/projects/my_script.py
  Script directory is: /home/user/projects
  Example data file path: /home/user/projects/data/config.txt

When run as a script, __file__ is correctly defined by Python.

Solution 2: Using inspect.getfile() (Alternative)

The inspect module provides tools for introspection. inspect.getfile() can often determine the file associated with an object (like a function defined in the current context). This might work in some interactive environments that save execution history or are linked to files (like some IDE consoles or notebooks), but it's less direct than using __file__ in a script.

import inspect
import os # For dirname

try:
    current_file_path = inspect.getfile(lambda: None)
    print(f"Path from inspect.getfile(): {current_file_path}")
    current_dir = os.path.dirname(current_file_path)
    print(f"Directory from inspect: {current_dir}")
except TypeError:
    print("inspect.getfile() could not determine the file path in this context.")

Example Output (when run as a script):

Path from inspect.getfile(): /home/user/projects/my_script.py
Directory from inspect: /home/user/projects

Example Output (in basic REPL):

inspect.getfile() could not determine the file path in this context.

Solution 3: Using os.path.abspath() (Workaround for Interactive)

If you are in an interactive session and specifically need the path of the directory you are currently in (the Current Working Directory - CWD), do not use __file__. Instead, use os.getcwd(). If you mistakenly type __file__ and want a quick workaround that sometimes gives a plausible directory path (though not the non-existent file path itself), you might see os.path.abspath('__file__') suggested, but this is potentially misleading.

import os

cwd = os.getcwd()
print(f"\nCurrent Working Directory (getcwd): {cwd}")

path_workaround = os.path.abspath('__file__')
print(f"Path from abspath('__file__'): {path_workaround}")
dir_workaround = os.path.dirname(path_workaround)
print(f"Directory from abspath workaround: {dir_workaround}") # Often matches CWD

Getting the Current Working Directory (os.getcwd())

To find the directory your interactive session or script is currently operating in, use os.getcwd(). This is independent of the script's own file location.

import os
print(f"Current Working Directory: {os.getcwd()}")

Getting the Script Name (sys.argv[0])

When running a script, sys.argv[0] usually contains the name (and sometimes path) of the script file itself as it was invoked from the command line.

import sys
print(f"Script name from sys.argv[0]: {sys.argv[0]}")

Example:

  • Running python my_script.py might output:
    Script name from sys.argv[0]: my_script.py
  • Running python /full/path/to/my_script.py might output:
    Script name from sys.argv[0]: /full/path/to/my_script.py

Accessing __file__ of Imported Modules

The __file__ attribute is defined for modules that you successfully import. You can access it to see where an imported module is located on your system.

import requests # Example: import an installed library
import os       # Example: import a standard library module

print(f"requests module path: {requests.__file__}")
print(f"os module path: {os.__file__}")

Example of Output (paths will vary)

requests module path: /path/to/venv/lib/python3.10/site-packages/requests/__init__.py
os module path: /usr/lib/python3.10/os.py

This works because import specifically loads code from a file, allowing Python to set the __file__ attribute for that module object.

Conclusion

The NameError: name '__file__' is not defined occurs because the special __file__ variable is only automatically defined by Python when running code from a script file (.py) or importing a module. It is not defined in standard interactive sessions.

To resolve this:

  1. Put your code in a .py file and run it using python your_script.py. This is the standard way to use __file__.
  2. If you need the current working directory, use os.getcwd().
  3. If you need the path of an imported module, access its __file__ attribute (e.g., imported_module.__file__).
  4. The inspect module (inspect.getfile()) offers an alternative way to potentially find file paths, but __file__ within a script is more direct.

Avoid trying to access __file__ directly in basic interactive shells where it has no meaning.

Navigation