Python File Extensions (py, pyc, pyw, pyo, pyd) and Deployment Options

File extensions

You probably know about .py and .pyc, but Python uses a few other extensions as well.

.py

Plain source files. On Windows, double-clicking runs them with python.exe.

.pyw

Another source extension. On Windows, double-clicking launches pythonw.exe, which skips the console window. Handy for GUI apps that do not need a terminal.

.pyc

Whenever Python executes a module it caches a compiled bytecode file alongside it. These .pyc files can be executed directly but are not human-readable.

.pyo

Optimized bytecode generated with the -O flag; similar to .pyc.

.pyd

Shared libraries written in another language (often C or C++) and importable from Python. They are not generated from .py files.

Deployment choices

I mostly ship Windows programs; other platforms usually just get the source.

Package as a standalone executable

For public releases the usual approach is to bundle everything into an .exe. Users do not need Python installed, and the format feels familiar. The downside is the size and occasional compatibility hiccups.

I typically use PyInstaller:

pyinstaller -F example.py

-F produces a single executable. For GUI apps that do not need a console window add -w:

pyinstaller -w -F example.py

Distribute compiled .pyc / .pyo

If users have Python installed and you would rather not share source code, ship the bytecode.

Python does not generate .pyc for scripts run directly—you must compile them:

1
2
import py_compile
py_compile.compile(r'c:\test.py')

Compile entire directories:

1
2
import compileall
compileall.compile_dir(dirpath)

Create a .pyo:

python -O -m py_compile file.py

For GUI apps without a console, create a small .pyw launcher that simply imports the compiled module.

Distribute source

Open-source projects usually share the .py files. As long as the user has a matching environment, the code runs.

References:

  1. python 文件 .py .pyc .pyw .pyo .pyd
  2. Python程序的执行原理
  3. python的pyc和pyo文件
  4. 运行Python程序(pyc)隐藏DOS窗口的简便方法
  5. py文件编译为pyc