Quick Answer

Module is not installed or not found in Python path. Install with pip, check module name spelling, or verify virtual environment activation.

Understanding the Issue

ImportError indicates Python cannot find the specified module. Common causes include uninstalled packages, typos in module names, virtual environment issues, or incorrect Python path configuration. Understanding package management and import mechanisms is essential for resolving these errors.

The Problem

This code demonstrates the issue:

Python Error
# Problem 1: Importing non-installed package
import requests  # ImportError if requests not installed
response = requests.get("https://api.example.com")

# Problem 2: Incorrect module name or path
import my_custom_module  # ImportError if file doesn't exist or not in path

The Solution

Here's the corrected code:

Python Fixed
# Solution 1: Proper package installation and management
import sys
import subprocess

def install_package(package_name):
    """Install package using pip programmatically"""
    try:
        subprocess.check_call([sys.executable, "-m", "pip", "install", package_name])
        print(f"Successfully installed {package_name}")
    except subprocess.CalledProcessError:
        print(f"Failed to install {package_name}")

def safe_import(module_name, package_name=None):
    """Safely import module with installation fallback"""
    try:
        module = __import__(module_name)
        print(f"Successfully imported {module_name}")
        return module
    except ImportError:
        print(f"Module {module_name} not found")
        if package_name:
            print(f"Try installing: pip install {package_name}")
            install_choice = input(f"Install {package_name}? (y/n): ")
            if install_choice.lower() == 'y':
                install_package(package_name)
                try:
                    module = __import__(module_name)
                    return module
                except ImportError:
                    print(f"Installation failed or module still not found")
        return None

# Example usage
requests_module = safe_import("requests", "requests")
if requests_module:
    # Use the module
    pass

# Solution 2: Handle module paths and custom modules
import os
import importlib.util

def add_to_path(directory):
    """Add directory to Python path"""
    if directory not in sys.path:
        sys.path.insert(0, directory)
        print(f"Added {directory} to Python path")

def import_from_file(module_name, file_path):
    """Import module from specific file path"""
    try:
        spec = importlib.util.spec_from_file_location(module_name, file_path)
        module = importlib.util.module_from_spec(spec)
        spec.loader.exec_module(module)
        return module
    except Exception as e:
        print(f"Failed to import {module_name} from {file_path}: {e}")
        return None

# Check current Python path
def show_python_path():
    """Display current Python path"""
    print("Current Python path:")
    for i, path in enumerate(sys.path):
        print(f"  {i}: {path}")

show_python_path()

# Virtual environment detection
def check_virtual_env():
    """Check if running in virtual environment"""
    in_venv = hasattr(sys, 'real_prefix') or (
        hasattr(sys, 'base_prefix') and sys.base_prefix != sys.prefix
    )
    
    if in_venv:
        print("Running in virtual environment")
        print(f"Python executable: {sys.executable}")
    else:
        print("Not in virtual environment")
        print("Consider using virtual environment for project isolation")

check_virtual_env()

# Common troubleshooting function
def troubleshoot_import(module_name):
    """Comprehensive import troubleshooting"""
    print(f"Troubleshooting import for: {module_name}")
    
    # Check if module exists in standard library
    try:
        import importlib
        spec = importlib.util.find_spec(module_name)
        if spec:
            print(f"? Module {module_name} found at: {spec.origin}")
        else:
            print(f"? Module {module_name} not found")
            print(f"  Try: pip install {module_name}")
    except Exception as e:
        print(f"Error checking module: {e}")
    
    # Show Python version
    print(f"Python version: {sys.version}")
    
    # Show pip installed packages (if available)
    try:
        import pkg_resources
        installed = [pkg.project_name for pkg in pkg_resources.working_set]
        if module_name in installed:
            print(f"? {module_name} is installed via pip")
        else:
            print(f"? {module_name} not found in pip packages")
    except ImportError:
        print("Cannot check pip packages (pkg_resources not available)")

# Example troubleshooting
troubleshoot_import("requests")
troubleshoot_import("nonexistent_module")

Key Takeaways

Install missing packages with pip install package_name. Check spelling of module names. Verify virtual environment activation. Add custom module directories to sys.path. Use importlib for dynamic imports and troubleshooting.