linux上基于requirements.txt安装依赖包提示pywin32找不到版本

问题

pywin32Windows-only 依赖,Linux 构建时 pip 找不到可安装版本。

解决

正确做法是:按平台条件安装依赖

1. requirements.txt

1
pywin32; sys_platform == "win32"

如果还有其他 Windows 专用依赖,也采用同样方式:

1
2
pywin32; sys_platform == "win32"
pywin32-ctypes; sys_platform == "win32"

Linux 上则不会安装这些包。


2. 如果是 pyproject.toml

1
2
3
4
[project]
dependencies = [
"pywin32; sys_platform == 'win32'",
]

3. 如果你的代码本身依赖 pywin32

仅修改依赖还不够。代码需要做平台隔离,例如:

1
2
3
4
5
import sys

if sys.platform == "win32":
import win32api
import win32con

或者:

1
2
3
4
if sys.platform == "win32":
from .windows import WindowsBackend
else:
from .linux import LinuxBackend

4. 构建平台

如果你现在的 CI/CD 只有 Windows,需要增加 Linux runner,例如 GitHub Actions:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
jobs:
build:
strategy:
matrix:
os:
- windows-latest
- ubuntu-latest

runs-on: ${{ matrix.os }}

steps:
- uses: actions/checkout@v4

- uses: actions/setup-python@v5
with:
python-version: "3.12"

- run: python -m pip install -U pip
- run: pip install -r requirements.txt
- run: python -m build

这样:

平台 pywin32 构建
Windows 安装 支持
Linux 跳过 支持

核心修改就是:

1
2
- pywin32
+ pywin32; sys_platform == "win32"