What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Some links on this page are affiliate links: if you buy through them we may earn a commission, at no extra cost to you.

Pyppeteer is not documented as Windows-only. It is an unofficial Python port of Puppeteer, and its project instructions describe downloading Chromium when a suitable browser is missing. If your script works on Windows but fails on Linux or macOS, the likely cause is a difference in browser installation, executable path, permissions, architecture, system dependencies, browser version, or runtime environment—not an intentional Windows restriction. Without the exact error and machine details, there is no reliable way to identify which one applies.

This guide walks through a platform-neutral diagnosis, gives a corrected launch pattern, and explains when switching to Playwright Python is worth considering. The project’s current README also describes Pyppeteer as unmaintained, an important maintenance consideration but not evidence that it cannot run outside Windows. Pyppeteer project repository

Why Pyppeteer can work on Windows but fail elsewhere

Pyppeteer code often looks portable while the browser environment beneath it is not. The Python script may be identical on two machines, but each machine can have a different Python environment, downloaded Chromium, filesystem layout, access permissions, CPU architecture, or set of operating-system dependencies. A script copied from Windows can also contain a Windows-only browser path.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Pyppeteer’s current project README says Python 3.8 or newer is required and describes downloading Chromium on first use if no suitable binary is available. The API reference documents browser-data directories separately for Windows, macOS, and Linux. Those details are incompatible with the idea that the package is designed only for Windows. Project README · API Reference, version 0.0.25

Common causes to check first

  • Different Python environments: Pyppeteer may be installed for one interpreter but the script runs under another virtual environment, service account, or system Python.
  • Missing or misplaced Chromium: the browser download may not have run, may be incomplete, or may be stored in a directory different from the one you checked.
  • Wrong executable path: a hard-coded Windows path will not identify a Linux or macOS browser binary.
  • Permissions or runtime differences: a browser executable that works for your desktop user may not be readable or launchable for a service, container, or CI account.
  • Browser compatibility: a locally installed Chrome or Chromium is not guaranteed to match the version Pyppeteer expects.
  • Platform-specific launch failure: a browser may be found but still fail to start because of architecture, system dependencies, or environment configuration.

The precise failure cannot be diagnosed from “works only on Windows” alone. Keep the complete exception and compare the operating system, architecture, Python and Pyppeteer versions, browser version, and execution context on both machines.

Fix it in a reliable order

Start with the least invasive checks. Avoid changing browser security settings or swapping browser versions before confirming which interpreter and browser the failing process is actually using.

  1. Identify the interpreter running the script. Activate the same virtual environment, container, or service environment used in production. Install Pyppeteer there, not merely in a different terminal’s default Python.
  2. Install Pyppeteer’s Chromium in that environment. The project documents pyppeteer-install as a way to download Chromium before running the script. Run it using the environment that will launch the program. Pyppeteer installation instructions
  3. Check the browser-data location. Confirm the browser files exist and are readable by the account that runs your code. If the default location is not where you expect, inspect PYPPETEER_HOME; on Linux, also check XDG_DATA_HOME.
  4. Try the bundled browser before a system browser. Omit executablePath and allow Pyppeteer to use its downloaded Chromium. This avoids assuming that a system browser version is compatible.
  5. If necessary, test a local browser explicitly. Use executablePath with the actual Chrome or Chromium executable path on that machine. Do not copy a Windows path, package name, or another user’s home-directory path as if it were universal.
  6. Capture the details of any remaining launch error. Record OS and architecture, Python and Pyppeteer versions, browser version, exact exception, the account executing the script, and whether it runs in a container or CI runner.

Install Chromium and understand its location

On a fresh setup, the project’s documented standalone installation command is:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
pyppeteer-install

This downloads Chromium before your application starts. The repository gives an approximate download size of 150 MB; it is the project’s stated approximation, not an independently measured size or a guaranteed download size for every environment. Plan for the download and browser files to be available to the same user and runtime that executes the script. Pyppeteer project repository

The API reference lists these default browser-data locations:

Operating system Documented default location
Windows C:Users<username>AppDataLocalpyppeteer
macOS /Users/<username>/Library/Application Support/pyppeteer
Linux /home/<username>/.local/share/pyppeteer, or $XDG_DATA_HOME/pyppeteer

PYPPETEER_HOME can override the location. These are defaults, not promises that a particular process is using them: environment variables, the active user account, or a customized runtime can change where files are stored. Pyppeteer API Reference

Use a portable launch pattern

Keep browser startup and page work inside an async function, and close the browser in a finally block so an exception does not leave a child browser process behind. The following pattern supports either Pyppeteer’s downloaded Chromium or a deliberately selected local executable:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
import asyncio
from pyppeteer import launch

async def main():
    browser = await launch(
        # Remove this line to use Pyppeteer's downloaded Chromium.
        executablePath="/path/to/chrome-or-chromium",
        headless=True,
    )
    try:
        page = await browser.newPage()
        await page.goto("https://example.com")
        print(await page.title())
    finally:
        await browser.close()

asyncio.run(main())

/path/to/chrome-or-chromium is explanatory, not a real path. Replace it with the actual executable path on the target machine, or remove the executablePath argument to use the downloaded browser. The API documents this launch option but warns that Pyppeteer works best with its bundled Chromium and does not guarantee compatibility with another browser version. Treat a system Chrome path as a diagnostic choice, not a guaranteed fix. Launch options and compatibility note

What to compare when the same code behaves differently

  • Interpreter and package: verify the failing program imports Pyppeteer from the intended Python environment.
  • Browser files: verify that the expected Chromium download completed and that the process user can read and launch it.
  • Path: use the target machine’s real executable path only when intentionally testing a local browser.
  • Version: note whether the run uses Pyppeteer’s bundled Chromium or an independently installed browser.
  • Execution context: compare an interactive shell with the actual service, container, or CI invocation; they may use different environment variables and permissions.

How to investigate errors without guessing

Use the exception text to decide which branch to follow. An executable-not-found error points first to installation or path configuration; a launch failure after the browser is found calls for environment, permissions, dependency, architecture, and version checks. A page that launches but does not load correctly is a different problem from a browser process that never starts.

Executable not found or browser download missing

Run pyppeteer-install in the environment used by the script, then check the documented data directory and overrides. If you configured executablePath, verify that it names a real executable on the target system and is accessible to the process user. Remove the override to test the managed Chromium download.

Browser exists but will not launch

Confirm the file is readable and executable for the launching account, then compare OS architecture and execution context with the working machine. Capture the full exception rather than replacing it with a generic “Pyppeteer failed” message. The sources establish that platform and version differences matter, but do not establish a universal dependency fix for an unspecified machine.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

System Chrome behaves differently from bundled Chromium

That difference may be a browser-version compatibility issue. Pyppeteer’s API reference explicitly says that the bundled Chromium is the best-supported choice and that compatibility with another version is not guaranteed. Test the managed browser first; if you need the system browser, record its exact version and verify the behavior in your own target environment.

One Fedora report is not a general platform diagnosis

A Pyppeteer issue reports a launch hang on Fedora 37 with Python 3.11 and Chrome 115.0.5790.3. It was opened on June 2, 2023, and describes one user’s setup; it does not prove that current Fedora releases, Linux generally, or Pyppeteer universally have the same problem or remedy. Compare your own versions and error before applying advice from that report. Pyppeteer issue #441

Do not make disabling the browser sandbox the default fix

A comment in that issue suggests disabling sandboxing, but the primary API documentation does not present that as a cross-platform remedy. Browser sandbox settings affect security. Do not add a no-sandbox option as a routine workaround; only investigate such a change in a narrowly defined environment after assessing its security implications.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Should you stay on Pyppeteer or move to Playwright?

The current Pyppeteer repository describes the project as unmaintained and recommends considering Playwright Python. That is a maintenance signal, not proof that an existing Pyppeteer script cannot be made to run. If you rely on Pyppeteer-specific behavior, reproduce and diagnose the current failure before deciding to migrate. Pyppeteer project repository

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Decision factor Pyppeteer Playwright Python
Maintenance signal The current repository says the project is unmaintained. Official Python documentation provides installation, browser management, and usage guidance.
Browser management Downloads Chromium when needed, offers pyppeteer-install, and permits an executablePath override. Installs browser binaries separately through its browser installation commands and documents browser management.
API choices Uses Pyppeteer’s async API. Documents both synchronous and asynchronous APIs.
Migration effort Existing code uses Pyppeteer method names and behavior. Expect to adapt code and test it; source compatibility is not promised.

Playwright’s documented setup separates installing the Python package from installing browser binaries. Its library guide covers synchronous and asynchronous use, while its browser guide explains browser installation and cache management. Review both before estimating a migration, especially if scripts run in a controlled CI or deployment environment. Playwright Python: Getting started · Playwright Python: Browsers

Or skip the browser setup

If your task is simply to capture a website rather than automate a browser session, ScreenshotNeo provides a screenshot API. It accepts one GET request with a URL and returns a PNG, JPEG, WebP, or PDF. Its clean-shot options accept consent banners and remove more than 60 known consent platforms, newsletter popups, and chat widgets before capture; each step can be turned off. Bot checks, blank pages, timeouts, failed loads, and cache hits are not billed, and the response identifies the page verdict and billing status in headers. An MCP server provides take_screenshot, get_page_info, and capture_pdf tools for AI agents.

For example, save a WebP screenshot of a page with cURL:

curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp

See the ScreenshotNeo API documentation for setup and options. ScreenshotNeo also supports full-page capture, CSS-selector element capture, dark mode, device presets and custom viewports, retina scale, PDF settings, HTML/CSS capture, custom CSS and JavaScript, click-before-capture, hiding selectors, wait conditions, request blocking, custom headers and cookies, user agents, authorization, timezone and geolocation, transparent backgrounds, resizing, configurable cache TTL, signed image links, asynchronous jobs with signed webhooks, bulk capture of up to 100 URLs per call, usage API, and an OpenAPI specification. Parameters used by other screenshot APIs also work to make switching easier.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

There is a free plan with 1,000 screenshots per month and no card required; paid plans start at $5 for 3,000 screenshots. ScreenshotNeo is made by Yorker Media. Sign up free for 1,000 screenshots a month with no card.

FAQ

Is Pyppeteer officially maintained by the Google Puppeteer team?

No. Pyppeteer is an unofficial Python port of Puppeteer; consult its project repository for its current maintenance status.

Can I use Pyppeteer with Python 3.7?

The current project repository states Python 3.8 or newer as a requirement. Check the repository’s current instructions if your deployment must use an older interpreter.

Does fixing the browser path guarantee that a page will load?

No. A correct executable path can address browser discovery, but page navigation can still fail for unrelated network, website, or runtime reasons. Diagnose the browser launch and page load as separate stages.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.