NameError: name 'os' is not defined in Python [Solved]

avatar
Borislav Hadzhiev

Last updated: Apr 8, 2024
3 min

banner

# NameError: name 'os' is not defined in Python

The Python "NameError: name 'os' is not defined" occurs when we use the os module without importing it first.

To solve the error, import the os module before using it - import os.

nameerror name os is not defined

Here is an example of how the error occurs.

main.py
BASE = '/user' # โ›”๏ธ NameError: name 'os' is not defined print(os.path.join(BASE, 'articles')) print(os.environ['VIRTUAL_ENV_PROMPT'])

# Import the os module before using it

To solve the error, we have to import the os module.

main.py
# ๐Ÿ‘‡๏ธ import os module first import os BASE = '/user' # ๐Ÿ‘‡๏ธ /user/articles print(os.path.join(BASE, 'articles')) # ๐Ÿ‘‡๏ธ (venv) print(os.environ['VIRTUAL_ENV_PROMPT'])

import os module before using it

Even though the os module is in the Python standard library, we still have to import it before using it.

Make sure you haven't used a capital letter o when importing os because module names are case-sensitive.

# Make sure to not import the os module in a nested scope

Also, make sure you haven't imported os in a nested scope, e.g. a function.

main.py
def join_path(): import os BASE = '/user' print(os.path.join(BASE, 'articles')) print(os.environ['VIRTUAL_ENV_PROMPT']) # โ›”๏ธ NameError: name 'os' is not defined print(os.environ['VIRTUAL_ENV_PROMPT'])

importing the os module in a nested scope

We imported the os module in a function, so we aren't able to use it outside of the function.

Import the module at the top level to be able to use it throughout your code.

main.py
import os def join_path(): BASE = '/user' print(os.path.join(BASE, 'articles')) print(os.environ['VIRTUAL_ENV_PROMPT']) print(os.environ['VIRTUAL_ENV_PROMPT'])

import the os module at the top level

The import statement for the os module has to come at the top of the file before any code that makes use of it.

# Make sure to not import the os module in a try/except statement

You also should be importing the os module in a try/except statement.

main.py
try: # ๐Ÿ‘‰๏ธ Code here could raise an error import os print(os.environ['VIRTUAL_ENV_PROMPT']) except ImportError: print(os.environ['VIRTUAL_ENV_PROMPT']) print(os.environ['VIRTUAL_ENV_PROMPT'])

The code sample works, however, if the code in the try statement raises an error, the os module won't get imported successfully.

This would cause the error because we are trying to access properties on the os module in the outer scope and the except block.

Instead, move the import statement to the top level of the file.

main.py
import os try: print(os.environ['VIRTUAL_ENV_PROMPT']) except ImportError: print(os.environ['VIRTUAL_ENV_PROMPT']) print(os.environ['VIRTUAL_ENV_PROMPT'])

# Importing functions directly from the os module

An alternative to importing the entire os module is to import only the functions and constants that your code uses.

main.py
from os import path, environ BASE = '/user' # ๐Ÿ‘‡๏ธ /user/articles print(path.join(BASE, 'articles')) # ๐Ÿ‘‡๏ธ (venv) print(environ['VIRTUAL_ENV_PROMPT'])

import functions directly from os module

The example shows how to import the path module and the environ mapping object from the os module.

Instead of accessing the members on the module, e.g. os.environ, we now access them directly.

This should be your preferred approach because it makes your code easier to read.

For example, when we use an import such as import os, it is much harder to see which functions from the os module are being used in the file.

Conversely, when we import specific functions, it is much easier to see which functions from the os module are being used.

The os module provides a portable way of using operating system-dependent functionality.

You can view all of the functions and constants the os module provides by visiting the official docs.

I wrote a book in which I share everything I know about how to become a better, more efficient programmer.
book cover
You can use the search field on my Home Page to filter through all of my articles.

Copyright ยฉ 2024 Borislav Hadzhiev