本篇作者向华是一名游戏行业从业者,也是 Perforce Helix Core(P4V)用户。
本文内容中存在长命令行,横屏观看更佳。
最近在一台新 MacBook 上部署 P4 工具链,发现 P4Python 库怎么也安装不上。
$ pip3 install p4python
Collecting p4python
Using cached p4python-2021.1.2128019.tar.gz (83 kB)
Building wheels for collected packages: p4python
Building wheel for p4python (setup.py) ... error
ERROR: Command errored out with exit status 1:
...
...
copying P4.py -> build/lib.macosx-10.14-x86_64-3.8
running build_ext
***********************************************
** Cannot build P4Python without SSL support **
***********************************************
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/private/..../p4python/setup.py", line 475, in <module>
do_setup()
...
...
File "/private/..../p4python/setup.py", line 292, in run
raise Exception("Parameter --ssl is needed")
Exception: Parameter --ssl is needed
----------------------------------------
ERROR: Failed building wheel for p4python
Running setup.py clean for p4python
Failed to build p4python
...
...
WARNING: You are using pip version 20.2.3;
however, version 22.0.3 is available.
You should consider upgrading via the
'/Library/Developer/CommandLineTools/usr/bin/python3 -m
pip install --upgrade pip' command.
因为在另一台 Mac Mini 上是可以安装成功的。
之前成功安装的 Mac 最新也就是 macOS Big Sur,直觉告诉我应该是这台 MacBook 的系统太新了,因为它的系统是当前最新的 macOS Monterey。
但我觉得应该可以尝试解决一下,毕竟这属于 Python 库范畴的问题,先不急着下定论。
先看看官方文档怎么说
从 Perforce 官网可以看到两篇关于p4python 和 ssl 的文档。
Installing p4python
https://www.perforce.com/manuals/p4python/Content/P4Python/python.installation.html
Compiling P4Python with SSL support
https://community.perforce.com/s/article/3728
文档中有提到,在 2019.1 版本之后,是需要安装 OpenSSL 的库的。
第二篇文档中是用 p4python 源码编译的教学,计划作为最后一招。
再看看别人怎么说
网上搜到一个方法:
pip3 install --install-option="--ssl" p4python
报错:
error: option --ssl not recognized片
又看到另一个说法,Python 版本不对,OK,那调整下Python版本试试。
手边儿在 Linux 上成功安装的 Python 版本有 3.7.7、3.8.2、3.10.2,当前本机的Python 版本是 3.8.9。
尝试换 Python 版本,安装 pyenv
brew install pyenv
试试 3.7.7
pyenv install 3.7.7
安装时,报 sendfile 报错。
Last 10 log lines:
./Modules/posixmodule.c:9197:15: error: implicit declaration of function 'sendfile' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
ret = sendfile(in, out, offset, &sbytes, &sf, flags);
再试安装 3.8.2。
同样报 sendfile 报错。
灰心哥内心 OS:难道都不能换 Python 版本了?
最后一试:
pyenv install 3.10.2
安装成功。
速度切换 local 为 3.10.2。
pyenv local 3.10.2
使用 Python 3.10.2 对应的 pip3 ( pip version 21.2.4 ) 安装一下 p4python。
令人失望,同样报 ssl 错误。
不折腾 Python 版本了,尝试换种姿势安装 p4python。
Perforce 官网下载 whl。
pip3 install p4python-2021.1.2128019-cp39-cp39-macosx_10_12_universal2.whl
仍旧报一样的错,想想也是,虽然是 wheel,但它跟 pip 安装,本质上是一样的。
Warning! 最后一击
折腾半天,应该只能按照官方文档来做一次源码编译了,并且都不知道是否有其他 dependency 的问题。
承接上文,注意到 WARNING 提到 pip 版本是 20.2.3,有新版本 22.0.3。
事到如今,没办法了,更一发试试!
$ /Library/Developer/CommandLineTools/usr/bin/python3 -m pip install --upgrade pip
Defaulting to user installation because normal site-packages is not writeable
Collecting pip
Downloading pip-22.0.3-py3-none-any.whl (2.1 MB)
|████████████████████████████████| 2.1 MB 583 kB/s
Installing collected packages: pip
WARNING: The scripts pip, pip3 and pip3.8 are installed in
'/Users/jasonxiang/Library/Python/3.8/bin' which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning,
use --no-warn-script-location.
Successfully installed pip-22.0.3
再安装 p4python 试试。
$ pip3 install p4python
Successfully installed p4python-2021.1.2128019
神 ~ 奇 ~ 地 ~ 成 ~ 功 ~ 了!
值得一提的是,pip v22.x.x 版本安装库时,还会有个彩色进度条和彩色安装速率,似乎也在表达一种庆祝
感谢阅读。
你好,我是向华。
前原神项目 P4 Admin,持续集成开发者,8 年游戏测试开发工程师。