{"library":"pytest-console-scripts","title":"Pytest plugin for testing console scripts","description":"pytest-console-scripts is a pytest plugin designed for comprehensive testing of Python console scripts. It offers two execution modes: an 'in-process' mode for fast development iteration by running scripts within the same interpreter as pytest, and a 'subprocess' mode to simulate real-world execution environments. The library is actively maintained, with its latest version being 1.4.1, and typically follows a minor release cadence as needed for bug fixes and Python version support.","language":"python","status":"active","last_verified":"Sun May 17","install":{"commands":["pip install pytest-console-scripts","pip install pytest-console-scripts==1.4.1"],"cli":null},"imports":["def test_my_script(script_runner): ..."],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"import pytest\nimport subprocess\nimport sys\n\n# Create a dummy console script and setup.py for demonstration\n# In a real project, these would exist in your project structure\n\n# --- my_package/setup.py ---\n# from setuptools import setup, find_packages\n# setup(\n#     name='my_package',\n#     version='0.1.0',\n#     packages=find_packages(),\n#     entry_points={\n#         'console_scripts': [\n#             'my-script=my_package.main:main'\n#         ]\n#     },\n# )\n\n# --- my_package/main.py ---\n# import sys\n# def main():\n#     if len(sys.argv) > 1 and sys.argv[1] == '--hello':\n#         print('Hello from my-script')\n#     else:\n#         print('Running my-script')\n\n# Simplified setup for a runnable quickstart within one file:\n# Create dummy files for demonstration purposes\n# A real setup would involve 'pip install -e .' in a virtual environment.\n\n# Create a temporary directory and files\nimport tempfile\nimport os\n\ndef create_dummy_project(tmp_path):\n    pkg_dir = tmp_path / \"my_package\"\n    pkg_dir.mkdir()\n    (pkg_dir / \"__init__.py\").touch()\n    (pkg_dir / \"main.py\").write_text(\n        \"\"\"\nimport sys\ndef main():\n    if len(sys.argv) > 1 and sys.argv[1] == '--hello':\n        print('Hello from my-script')\n    else:\n        print('Running my-script')\n    sys.exit(0)\n\"\"\"\n    )\n    (tmp_path / \"setup.py\").write_text(\n        \"\"\"\nfrom setuptools import setup, find_packages\nsetup(\n    name='my_package',\n    version='0.1.0',\n    packages=find_packages(),\n    entry_points={\n        'console_scripts': [\n            'my-script=my_package.main:main'\n        ]\n    },\n)\n\"\"\"\n    )\n    return tmp_path\n\n# Example Test File (e.g., test_scripts.py)\ndef test_my_console_script(script_runner, tmp_path):\n    # Set up the dummy project and install it in editable mode\n    project_root = create_dummy_project(tmp_path)\n    subprocess.run([sys.executable, '-m', 'pip', 'install', '-e', str(project_root)], check=True)\n\n    # Run the script without arguments\n    result = script_runner.run(['my-script'])\n    assert result.returncode == 0\n    assert 'Running my-script' in result.stdout\n    assert result.stderr == ''\n\n    # Run the script with an argument\n    result_hello = script_runner.run(['my-script', '--hello'])\n    assert result_hello.returncode == 0\n    assert 'Hello from my-script' in result_hello.stdout\n    assert result_hello.stderr == ''\n\n    # Test behavior in subprocess mode (optional)\n    result_subprocess = script_runner.run(['my-script'], launch_mode='subprocess')\n    assert result_subprocess.returncode == 0\n    assert 'Running my-script' in result_subprocess.stdout","lang":"python","description":"To use `pytest-console-scripts`, define your console scripts in your project's `setup.py` (or `pyproject.toml`) and install your package in editable mode (`pip install -e .`). Then, in your pytest test files, use the `script_runner` fixture to execute your scripts and assert their output and exit codes. This example demonstrates creating a minimal project structure, installing it, and testing a console script using both default (in-process) and subprocess launch modes.","tag":null,"tag_description":null,"last_tested":null,"results":[]},"compatibility":{"tag":null,"tag_description":null,"last_tested":"2026-05-17","installed_version":"1.4.1","pypi_latest":"1.4.1","is_stale":false,"summary":{"python_range":"3.10–3.9","success_rate":100,"avg_install_s":2.7,"avg_import_s":null,"wheel_type":"wheel"},"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"pytest-console-scripts","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"30.7M"},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"pytest-console-scripts==1.4.1","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"30.7M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"pytest-console-scripts","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2.7,"import_time_s":null,"mem_mb":null,"disk_size":"31M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"pytest-console-scripts==1.4.1","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2.6,"import_time_s":null,"mem_mb":null,"disk_size":"31M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"pytest-console-scripts","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"33.6M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"pytest-console-scripts==1.4.1","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"33.6M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"pytest-console-scripts","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2.6,"import_time_s":null,"mem_mb":null,"disk_size":"34M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"pytest-console-scripts==1.4.1","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2.6,"import_time_s":null,"mem_mb":null,"disk_size":"34M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"pytest-console-scripts","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"25.2M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"pytest-console-scripts==1.4.1","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"25.2M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"pytest-console-scripts","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2.5,"import_time_s":null,"mem_mb":null,"disk_size":"26M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"pytest-console-scripts==1.4.1","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2.5,"import_time_s":null,"mem_mb":null,"disk_size":"26M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"pytest-console-scripts","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"25.0M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"pytest-console-scripts==1.4.1","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"25.0M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"pytest-console-scripts","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2.5,"import_time_s":null,"mem_mb":null,"disk_size":"25M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"pytest-console-scripts==1.4.1","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2.5,"import_time_s":null,"mem_mb":null,"disk_size":"25M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"pytest-console-scripts","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"30.4M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"pytest-console-scripts==1.4.1","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"30.4M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"pytest-console-scripts","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":3.3,"import_time_s":null,"mem_mb":null,"disk_size":"31M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"pytest-console-scripts==1.4.1","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":3.2,"import_time_s":null,"mem_mb":null,"disk_size":"31M"}]}}