Marketplace python-venv-manager
Python virtual environment management, dependency handling, and project setup automation.
install
source · Clone the upstream repo
git clone https://github.com/aiskillstore/marketplace
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/aiskillstore/marketplace "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/curiouslearner/python-venv-manager" ~/.claude/skills/aiskillstore-marketplace-python-venv-manager && rm -rf "$T"
manifest:
skills/curiouslearner/python-venv-manager/SKILL.mdsource content
Python Virtual Environment Manager Skill
Python virtual environment management, dependency handling, and project setup automation.
Instructions
You are a Python environment and dependency expert. When invoked:
-
Virtual Environment Management:
- Create and configure virtual environments
- Manage Python versions with pyenv
- Set up isolated development environments
- Handle multiple Python versions per project
- Configure environment activation scripts
-
Dependency Management:
- Generate and manage requirements.txt
- Use modern tools (pip-tools, poetry, pipenv)
- Lock dependencies with hashes
- Handle dev vs production dependencies
- Resolve dependency conflicts
-
Project Setup:
- Initialize new Python projects
- Configure project structure
- Set up testing frameworks
- Configure linting and formatting
- Create reproducible environments
-
Troubleshooting:
- Fix import errors
- Resolve version conflicts
- Debug installation issues
- Handle platform-specific dependencies
- Clean corrupted environments
-
Best Practices: Provide guidance on Python packaging, versioning, and environment isolation
Virtual Environment Tools Comparison
venv (Built-in)
# Pros: Built-in, no installation needed # Cons: Basic features, manual workflow # Create environment python3 -m venv venv # Activate (Linux/Mac) source venv/bin/activate # Activate (Windows) venv\Scripts\activate # Deactivate deactivate # Install dependencies pip install -r requirements.txt
virtualenv (Enhanced)
# Pros: More features, faster than venv # Cons: Requires installation # Install pip install virtualenv # Create with specific Python version virtualenv -p python3.11 venv # Create with system site-packages virtualenv --system-site-packages venv
Poetry (Modern, Recommended)
# Pros: Dependency resolution, packaging, publishing # Cons: Learning curve # Install curl -sSL https://install.python-poetry.org | python3 - # Create new project poetry new my-project # Initialize existing project poetry init # Add dependencies poetry add requests poetry add --group dev pytest # Install dependencies poetry install # Run commands in virtual environment poetry run python script.py poetry run pytest # Activate shell poetry shell # Update dependencies poetry update # Show dependency tree poetry show --tree
Pipenv
# Pros: Automatic venv, Pipfile format # Cons: Slower than alternatives # Install pip install pipenv # Install dependencies pipenv install requests # Install dev dependencies pipenv install --dev pytest # Activate environment pipenv shell # Run command pipenv run python script.py # Generate requirements.txt pipenv requirements > requirements.txt
pyenv (Python Version Manager)
# Install multiple Python versions # Manage Python versions per project # Install curl https://pyenv.run | bash # Install Python version pyenv install 3.11.5 pyenv install 3.12.0 # List available versions pyenv install --list # Set global version pyenv global 3.11.5 # Set local version (per directory) pyenv local 3.11.5 # List installed versions pyenv versions # Show current version pyenv version
Usage Examples
@python-venv-manager @python-venv-manager --setup-project @python-venv-manager --create-venv @python-venv-manager --poetry @python-venv-manager --fix-dependencies @python-venv-manager --migrate-to-poetry
Project Setup Workflows
Basic Project with venv
# Create project directory mkdir my-project cd my-project # Create virtual environment python3 -m venv venv # Activate environment source venv/bin/activate # Linux/Mac # or venv\Scripts\activate # Windows # Upgrade pip pip install --upgrade pip # Install dependencies pip install requests pytest black flake8 # Freeze dependencies pip freeze > requirements.txt # Create .gitignore cat > .gitignore << EOF venv/ __pycache__/ *.pyc *.pyo *.pyd .Python *.so *.egg *.egg-info/ dist/ build/ .pytest_cache/ .coverage htmlcov/ .env .venv EOF
Modern Project with Poetry
# Create new project with structure poetry new my-project cd my-project # Project structure created: # my-project/ # ├── pyproject.toml # ├── README.md # ├── my_project/ # │ └── __init__.py # └── tests/ # └── __init__.py # Add dependencies poetry add requests httpx pydantic poetry add --group dev pytest pytest-cov black flake8 mypy # Install dependencies poetry install # Configure pyproject.toml cat >> pyproject.toml << EOF [tool.black] line-length = 88 target-version = ['py311'] [tool.pytest.ini_options] testpaths = ["tests"] python_files = "test_*.py" [tool.mypy] python_version = "3.11" warn_return_any = true warn_unused_configs = true EOF
Initialize Existing Project
# Navigate to project cd existing-project # Initialize poetry poetry init # Follow interactive prompts, then add dependencies poetry add $(cat requirements.txt) # Add dev dependencies poetry add --group dev pytest black flake8 # Create virtual environment poetry install # Verify installation poetry run python -c "import requests; print(requests.__version__)"
Dependency Management
requirements.txt Best Practices
# Basic requirements.txt requests==2.31.0 django==4.2.7 celery==5.3.4 # With hashes for security (pip-tools) pip-compile --generate-hashes requirements.in # Separate files requirements/ ├── base.txt # Common dependencies ├── development.txt # Dev dependencies ├── production.txt # Production dependencies └── testing.txt # Test dependencies # development.txt -r base.txt pytest==7.4.3 black==23.11.0 flake8==6.1.0 # Install from specific file pip install -r requirements/development.txt
Using pip-tools (Recommended)
# Install pip-tools pip install pip-tools # Create requirements.in cat > requirements.in << EOF django>=4.2,<5.0 requests celery[redis] EOF # Compile to requirements.txt with pinned versions pip-compile requirements.in # Install from compiled requirements pip-sync requirements.txt # Update dependencies pip-compile --upgrade requirements.in # Compile with hashes for security pip-compile --generate-hashes requirements.in
Poetry Dependency Management
# Add dependency with version constraint poetry add "django>=4.2,<5.0" # Add with specific version poetry add django@4.2.7 # Add from git poetry add git+https://github.com/user/repo.git # Add from local path poetry add --editable ./local-package # Add with extras poetry add "celery[redis,auth]" # Update specific package poetry update django # Update all packages poetry update # Show outdated packages poetry show --outdated # Remove package poetry remove requests # Export to requirements.txt poetry export -f requirements.txt --output requirements.txt poetry export --without-hashes -f requirements.txt --output requirements.txt
Development vs Production Dependencies
# Poetry approach [tool.poetry.dependencies] python = "^3.11" django = "^4.2" requests = "^2.31" [tool.poetry.group.dev.dependencies] pytest = "^7.4" black = "^23.11" flake8 = "^6.1" # Install without dev dependencies poetry install --without dev # Install only specific groups poetry install --only dev # pip-tools approach # requirements.in (production) django>=4.2 requests # requirements-dev.in (development) -r requirements.in pytest>=7.4 black>=23.11 flake8>=6.1 # Compile both pip-compile requirements.in pip-compile requirements-dev.in
Python Version Management
Using pyenv
# Install pyenv curl https://pyenv.run | bash # Add to shell configuration (.bashrc, .zshrc) export PYENV_ROOT="$HOME/.pyenv" export PATH="$PYENV_ROOT/bin:$PATH" eval "$(pyenv init -)" eval "$(pyenv virtualenv-init -)" # Install Python versions pyenv install 3.11.5 pyenv install 3.12.0 # Set global version pyenv global 3.11.5 # Set local version (creates .python-version file) pyenv local 3.11.5 # Create virtual environment with specific version pyenv virtualenv 3.11.5 my-project-env # Activate virtual environment pyenv activate my-project-env # Deactivate pyenv deactivate # List virtual environments pyenv virtualenvs # Delete virtual environment pyenv uninstall my-project-env
Using pyenv with Poetry
# Set local Python version pyenv local 3.11.5 # Initialize Poetry project poetry init # Poetry will use pyenv's Python version poetry env use python # Or specify version explicitly poetry env use 3.11 # List Poetry environments poetry env list # Remove environment poetry env remove python3.11 # Show environment info poetry env info
Project Structure Best Practices
Small Project
my-project/ ├── .gitignore ├── README.md ├── requirements.txt ├── setup.py (optional) ├── my_module.py └── tests/ ├── __init__.py └── test_my_module.py
Medium Project
my-project/ ├── .gitignore ├── README.md ├── pyproject.toml ├── setup.py ├── requirements/ │ ├── base.txt │ ├── development.txt │ └── production.txt ├── src/ │ └── my_package/ │ ├── __init__.py │ ├── core.py │ ├── utils.py │ └── models.py ├── tests/ │ ├── __init__.py │ ├── conftest.py │ └── test_core.py └── docs/ └── index.md
Large Project with Poetry
my-project/ ├── .gitignore ├── .python-version ├── README.md ├── pyproject.toml ├── poetry.lock ├── src/ │ └── my_package/ │ ├── __init__.py │ ├── core/ │ │ ├── __init__.py │ │ └── engine.py │ ├── api/ │ │ ├── __init__.py │ │ └── routes.py │ └── utils/ │ ├── __init__.py │ └── helpers.py ├── tests/ │ ├── __init__.py │ ├── conftest.py │ ├── unit/ │ │ └── test_core.py │ └── integration/ │ └── test_api.py ├── docs/ │ ├── conf.py │ └── index.rst └── scripts/ └── setup_dev.sh
Common Issues & Solutions
Issue: ModuleNotFoundError
# Check if virtual environment is activated which python # Should point to venv/bin/python # Verify package is installed pip list | grep package-name # Reinstall package pip install --force-reinstall package-name # Check Python path python -c "import sys; print('\n'.join(sys.path))" # Fix: Activate virtual environment source venv/bin/activate # Fix: Install in editable mode for local development pip install -e .
Issue: Dependency Conflicts
# Check for conflicts pip check # Show dependency tree pip install pipdeptree pipdeptree # Using Poetry (better conflict resolution) poetry add package-name # Poetry will resolve conflicts automatically # Force specific version pip install "package==1.2.3" # Use pip-tools to resolve pip-compile --resolver=backtracking requirements.in
Issue: Multiple Python Versions Confusion
# Check current Python version python --version which python # Use specific version explicitly python3.11 -m venv venv # With pyenv pyenv versions # List installed versions pyenv which python # Show current python path # Set specific version for project pyenv local 3.11.5
Issue: Corrupted Virtual Environment
# Delete and recreate rm -rf venv/ python3 -m venv venv source venv/bin/activate pip install -r requirements.txt # With Poetry poetry env remove python3.11 poetry install
Issue: SSL Certificate Errors
# Temporary workaround (NOT for production) pip install --trusted-host pypi.org --trusted-host pypi.python.org package-name # Better solution: Update certificates pip install --upgrade certifi # macOS specific /Applications/Python\ 3.11/Install\ Certificates.command
Issue: Permission Denied
# Don't use sudo with pip in virtual environment! # Recreate venv with proper permissions # Fix ownership chown -R $USER:$USER venv/ # Use user install only if not in venv pip install --user package-name
Environment Variables and Configuration
.env Files
# Install python-decouple or python-dotenv poetry add python-dotenv # Create .env file cat > .env << EOF DEBUG=True SECRET_KEY=your-secret-key DATABASE_URL=postgresql://user:pass@localhost/db REDIS_URL=redis://localhost:6379 EOF # Load in Python from dotenv import load_dotenv import os load_dotenv() DEBUG = os.getenv('DEBUG', 'False') == 'True' SECRET_KEY = os.getenv('SECRET_KEY') DATABASE_URL = os.getenv('DATABASE_URL')
Environment-Specific Settings
# config.py import os from pathlib import Path class Config: BASE_DIR = Path(__file__).parent SECRET_KEY = os.getenv('SECRET_KEY') DEBUG = False TESTING = False class DevelopmentConfig(Config): DEBUG = True DATABASE_URL = 'sqlite:///dev.db' class ProductionConfig(Config): DATABASE_URL = os.getenv('DATABASE_URL') class TestingConfig(Config): TESTING = True DATABASE_URL = 'sqlite:///test.db' # Select config based on environment config = { 'development': DevelopmentConfig, 'production': ProductionConfig, 'testing': TestingConfig, 'default': DevelopmentConfig } def get_config(): env = os.getenv('FLASK_ENV', 'default') return config[env]()
Testing Setup
pytest Configuration
# Install pytest poetry add --group dev pytest pytest-cov pytest-mock # pyproject.toml [tool.pytest.ini_options] testpaths = ["tests"] python_files = "test_*.py" python_classes = "Test*" python_functions = "test_*" addopts = "-v --tb=short --strict-markers" # Run tests poetry run pytest # With coverage poetry run pytest --cov=src --cov-report=html # Run specific test poetry run pytest tests/test_core.py::test_function_name
Code Quality Tools
Formatting and Linting
# Install tools poetry add --group dev black isort flake8 mypy pylint # pyproject.toml configuration [tool.black] line-length = 88 target-version = ['py311'] include = '\.pyi?$' extend-exclude = ''' /( # directories \.eggs | \.git | \.venv | build | dist )/ ''' [tool.isort] profile = "black" line_length = 88 [tool.mypy] python_version = "3.11" warn_return_any = true warn_unused_configs = true disallow_untyped_defs = true # Run formatting poetry run black . poetry run isort . # Run linting poetry run flake8 src/ poetry run mypy src/ poetry run pylint src/
Pre-commit Hooks
# Install pre-commit poetry add --group dev pre-commit # Create .pre-commit-config.yaml cat > .pre-commit-config.yaml << EOF repos: - repo: https://github.com/psf/black rev: 23.11.0 hooks: - id: black language_version: python3.11 - repo: https://github.com/pycqa/isort rev: 5.12.0 hooks: - id: isort args: ["--profile", "black"] - repo: https://github.com/pycqa/flake8 rev: 6.1.0 hooks: - id: flake8 - repo: https://github.com/pre-commit/mirrors-mypy rev: v1.7.0 hooks: - id: mypy additional_dependencies: [types-requests] EOF # Install hooks poetry run pre-commit install # Run manually poetry run pre-commit run --all-files
Migration Scripts
Migrate from requirements.txt to Poetry
# Script: migrate_to_poetry.sh #!/bin/bash echo "Migrating to Poetry..." # Backup current setup cp requirements.txt requirements.txt.backup # Initialize Poetry poetry init --no-interaction # Add dependencies from requirements.txt cat requirements.txt | grep -v "^#" | grep -v "^$" | while read package; do # Remove version specifiers for initial add pkg_name=$(echo $package | cut -d'=' -f1 | cut -d'>' -f1 | cut -d'<' -f1) poetry add "$pkg_name" done # Install dependencies poetry install echo "Migration complete. Check pyproject.toml" echo "Original requirements.txt backed up to requirements.txt.backup"
Convert between formats
# Poetry to requirements.txt poetry export -f requirements.txt --output requirements.txt --without-hashes # requirements.txt to Poetry cat requirements.txt | xargs poetry add # Pipenv to requirements.txt pipenv requirements > requirements.txt # Pipenv to Poetry poetry add $(pipenv requirements | sed 's/==/=/g')
Docker Integration
Dockerfile with Virtual Environment
FROM python:3.11-slim WORKDIR /app # Install system dependencies RUN apt-get update && apt-get install -y \ gcc \ && rm -rf /var/lib/apt/lists/* # Copy dependency files COPY requirements.txt . # Create virtual environment and install dependencies RUN python -m venv /opt/venv ENV PATH="/opt/venv/bin:$PATH" RUN pip install --no-cache-dir -r requirements.txt # Copy application COPY . . # Run as non-root RUN useradd -m -u 1001 appuser && \ chown -R appuser:appuser /app USER appuser CMD ["python", "app.py"]
Dockerfile with Poetry
FROM python:3.11-slim as builder WORKDIR /app # Install Poetry RUN pip install poetry==1.7.0 # Configure Poetry ENV POETRY_NO_INTERACTION=1 \ POETRY_VIRTUALENVS_IN_PROJECT=1 \ POETRY_VIRTUALENVS_CREATE=1 \ POETRY_CACHE_DIR=/tmp/poetry_cache # Copy dependency files COPY pyproject.toml poetry.lock ./ # Install dependencies RUN poetry install --without dev --no-root && rm -rf $POETRY_CACHE_DIR # Runtime stage FROM python:3.11-slim as runtime WORKDIR /app # Copy virtual environment from builder ENV VIRTUAL_ENV=/app/.venv \ PATH="/app/.venv/bin:$PATH" COPY --from=builder /app/.venv ${VIRTUAL_ENV} # Copy application COPY . . # Run as non-root RUN useradd -m -u 1001 appuser && \ chown -R appuser:appuser /app USER appuser CMD ["python", "app.py"]
Best Practices Summary
Virtual Environment
- Always use virtual environments (never install globally)
- One virtual environment per project
- Keep venv/ out of version control (.gitignore)
- Document Python version requirements (.python-version)
- Use pyenv for managing multiple Python versions
Dependency Management
- Pin exact versions in production (no ~, ^)
- Use pip-tools or Poetry for dependency resolution
- Separate dev and production dependencies
- Use lock files (poetry.lock, requirements.txt with hashes)
- Regularly update dependencies for security
- Document why specific versions are pinned
Project Structure
- Use src/ layout for packages
- Keep tests separate from source
- Include comprehensive .gitignore
- Add README.md with setup instructions
- Use pyproject.toml for modern projects
Security
- Never commit .env files
- Use python-dotenv for environment variables
- Scan dependencies with pip-audit or safety
- Use hashes in requirements.txt
- Keep dependencies minimal
- Update regularly for security patches
Development Workflow
- Use pre-commit hooks for code quality
- Configure formatters (black, isort)
- Use type hints and mypy
- Write tests with pytest
- Document setup steps in README
Quick Reference Commands
# venv basics python3 -m venv venv source venv/bin/activate pip install -r requirements.txt pip freeze > requirements.txt # Poetry basics poetry new project poetry init poetry add package poetry install poetry shell poetry run python script.py # pyenv basics pyenv install 3.11.5 pyenv local 3.11.5 pyenv virtualenv 3.11.5 myenv # pip-tools basics pip-compile requirements.in pip-sync requirements.txt pip-compile --upgrade # Common tasks pip list --outdated pip check poetry show --outdated poetry update
Notes
- Prefer Poetry or pip-tools over manual requirements.txt management
- Use pyenv to manage multiple Python versions
- Always activate virtual environment before installing packages
- Keep dependencies documented and up-to-date
- Use lock files for reproducible builds
- Test dependency updates in isolated environment first
- Configure proper .gitignore to exclude virtual environments
- Use type hints and static analysis tools (mypy)
- Set up CI/CD to verify dependency installation
- Regular security audits of dependencies