What's Actually Happening
Python package was installed in virtual environment but cannot be imported. ModuleNotFoundError occurs when trying to use the package.
The Error You'll See
```python >>> import mypackage
ModuleNotFoundError: No module named 'mypackage' ```
Package installed but not found:
```bash $ pip install mypackage Successfully installed mypackage-1.0.0
$ python -c "import mypackage" ModuleNotFoundError: No module named 'mypackage' ```
Wrong Python version:
```bash $ python3 -c "import mypackage" # Works
$ python -c "import mypackage" # Fails (Python 2) ```
Wrong virtual environment:
```bash $ pip show mypackage
Location: /path/to/venv1/lib/python3.11/site-packages
# But running from venv2 ```
Why This Happens
- 1.Wrong virtual environment - Package installed in different venv
- 2.Not activated - Virtual environment not activated
- 3.PATH issue - Python not using venv's Python
- 4.Different Python version - Package for Python 3.x, running Python 2.x
- 5.pip vs pip3 - Installing with pip for wrong Python
- 6.User install - Package installed to --user, not in venv
Step 1: Check Virtual Environment Activation
```bash # Check if venv is activated: echo $VIRTUAL_ENV
# Should show path to venv # Empty = not activated
# Check Python path: which python
# Should point to venv/bin/python # e.g., /path/to/venv/bin/python
# Check pip path: which pip
# Should point to venv/bin/pip
# Activate virtual environment: source venv/bin/activate # Linux/Mac venv\Scripts\activate # Windows
# Check activation indicator: # Prompt should show (venv) prefix
# Verify activation: python -c "import sys; print(sys.prefix)"
# Should show venv path, not system Python ```
Step 2: Verify Package Installation
```bash # Check if package is installed in venv: pip show mypackage
# Shows: # Name: mypackage # Version: 1.0.0 # Location: /path/to/venv/lib/python3.11/site-packages
# Check location matches venv: # Location should be in your VIRTUAL_ENV path
# List installed packages: pip list
# Freeze all packages: pip freeze
# Check specific package: pip freeze | grep mypackage
# Check package details: pip show -f mypackage
# Check package location: pip show mypackage | grep Location
# Verify package files exist: ls /path/to/venv/lib/python3.11/site-packages/mypackage* ```
Step 3: Check Python Executable
```bash # Check which Python is running: which python
# If not in venv, deactivate and reactivate: deactivate source venv/bin/activate
# Check Python version: python --version
# Check full path: python -c "import sys; print(sys.executable)"
# Should be: /path/to/venv/bin/python
# Check Python location: ls -la venv/bin/python*
# Should have python, python3, python3.x links
# Use explicit venv Python: /path/to/venv/bin/python -c "import mypackage"
# If this works, activation issue
# Create venv with specific Python: python3.11 -m venv venv ```
Step 4: Check pip Installation Location
```bash # Which pip was used: which pip
# Use venv's pip explicitly: venv/bin/pip install mypackage
# Check pip version: pip --version
# Shows: pip 23.x from /path/to/venv/lib/python...
# Package installed to wrong location: pip show mypackage | grep Location
# If Location is /home/user/.local/lib... # It's installed with --user, not in venv
# Reinstall in venv: pip install --force-reinstall mypackage
# Or use explicit pip: venv/bin/pip install mypackage
# Check for user installation: pip config list | grep user
# Uninstall and reinstall: pip uninstall mypackage venv/bin/pip install mypackage ```
Step 5: Fix PATH Issues
```bash # Check PATH: echo $PATH
# After activation, venv/bin should be first: # /path/to/venv/bin:/usr/bin:/bin:...
# If venv/bin not in PATH: # Check activate script: cat venv/bin/activate
# PATH manipulation should be there
# Fix PATH manually: export PATH="/path/to/venv/bin:$PATH"
# Check activate script content: grep PATH venv/bin/activate
# Re-create venv if activate is broken: python3 -m venv venv --clear
# Or recreate: rm -rf venv python3 -m venv venv source venv/bin/activate pip install -r requirements.txt ```
Step 6: Check Python Version Compatibility
```bash # Check Python version: python --version
# Check package requirements: pip show mypackage | grep Requires-Python
# If package requires Python 3.8+: # And you're using Python 3.7, won't work
# Check venv Python version: venv/bin/python --version
# Recreate venv with correct Python: python3.11 -m venv venv
# Check available Python versions: ls /usr/bin/python*
# Use specific Python: python3.11 -m venv venv source venv/bin/activate
# Install package for correct version: pip install mypackage ```
Step 7: Reinstall Package Properly
```bash # Clear pip cache: pip cache purge
# Uninstall existing: pip uninstall mypackage -y
# Reinstall in active venv: pip install mypackage
# With version: pip install mypackage==1.0.0
# From requirements: pip install -r requirements.txt
# Verify installation: pip show mypackage
# Test import: python -c "import mypackage; print('OK')"
# Force reinstall: pip install --force-reinstall --no-cache-dir mypackage
# Install specific version from PyPI: pip install mypackage --index-url https://pypi.org/simple/ ```
Step 8: Check Package Module Structure
```bash # Check package structure: pip show -f mypackage | head -20
# List package files: ls /path/to/venv/lib/python3.11/site-packages/mypackage/
# Check for __init__.py: ls /path/to/venv/lib/python3.11/site-packages/mypackage/__init__.py
# If missing, package might be single file: ls /path/to/venv/lib/python3.11/site-packages/mypackage.py
# Import with correct name: # Package name != import name sometimes
# Check package metadata: pip show mypackage
# Check import name: cat /path/to/venv/lib/python3.11/site-packages/mypackage-*.dist-info/top_level.txt
# Example: # Package name: beautifulsoup4 # Import name: bs4 python -c "import bs4" # Works python -c "import beautifulsoup4" # Fails ```
Step 9: Fix Virtual Environment Issues
```bash # Recreate venv from scratch: rm -rf venv python3 -m venv venv source venv/bin/activate
# Install all packages: pip install -r requirements.txt
# Check venv configuration: cat venv/pyvenv.cfg
# Should show: # home = /usr/bin/python3 # include-system-site-packages = false
# Enable system packages (if needed): python3 -m venv venv --system-site-packages
# Use virtualenv (alternative): pip install virtualenv virtualenv venv
# Use poetry (alternative): poetry install
# Use conda (alternative): conda create -n myenv python=3.11 conda activate myenv conda install mypackage ```
Step 10: Python Venv Package Verification Script
```bash # Create verification script: cat << 'EOF' > /usr/local/bin/check-pyvenv-package.sh #!/bin/bash
PACKAGE=$1
echo "=== Virtual Environment Status ===" echo "VIRTUAL_ENV: $VIRTUAL_ENV" echo "Python path: $(which python)" echo "pip path: $(which pip)"
echo "" echo "=== Python Version ===" python --version python -c "import sys; print('Executable:', sys.executable)" python -c "import sys; print('Prefix:', sys.prefix)"
echo "" echo "=== PATH (first 5) ===" echo $PATH | tr ':' '\n' | head -5
if [ -n "$PACKAGE" ]; then echo "" echo "=== Package: $PACKAGE ===" pip show $PACKAGE || echo "Package not found"
echo "" echo "=== Package Location ===" LOCATION=$(pip show $PACKAGE | grep Location | cut -d' ' -f2) echo "Location: $LOCATION"
if [ -n "$VIRTUAL_ENV" ]; then if [[ "$LOCATION" == *"$VIRTUAL_ENV"* ]]; then echo "Package is in active venv: YES" else echo "Package is in active venv: NO" echo "Package installed elsewhere!" fi fi
echo "" echo "=== Import Test ===" python -c "import $PACKAGE; print('Import: SUCCESS')" || echo "Import: FAILED" fi
echo "" echo "=== Installed Packages ===" pip list | head -20
echo "" echo "=== Recommendations ===" if [ -z "$VIRTUAL_ENV" ]; then echo "WARNING: No virtual environment active" echo "Activate: source venv/bin/activate" fi EOF
chmod +x /usr/local/bin/check-pyvenv-package.sh
# Usage: /usr/local/bin/check-pyvenv-package.sh mypackage
# Quick check: alias venv-check='echo "VENV: $VIRTUAL_ENV" && which python && which pip' ```
Python Venv Package Checklist
| Check | Command | Expected |
|---|---|---|
| Venv activated | echo $VIRTUAL_ENV | Path to venv |
| Python path | which python | venv/bin/python |
| pip path | which pip | venv/bin/pip |
| Package location | pip show | In VIRTUAL_ENV |
| Import test | python -c "import pkg" | Success |
| Python version | python --version | Matches requirements |
Verify the Fix
```bash # After fixing package issue
# 1. Check activation echo $VIRTUAL_ENV // /path/to/venv
# 2. Check Python path which python // /path/to/venv/bin/python
# 3. Check package location pip show mypackage | grep Location // In VIRTUAL_ENV path
# 4. Test import python -c "import mypackage" // No error
# 5. Run application python app.py // Works correctly
# 6. Check all requirements pip list // All packages installed ```
Related Issues
- [Fix Python ModuleNotFoundError](/articles/fix-python-modulenotfounderror)
- [Fix Python Virtual Environment Not Activating](/articles/fix-python-virtual-environment-not-activating)
- [Fix Python pip Install Failed](/articles/fix-python-pip-install-failed)