由于需要重构项目,以前是在 ubuntu上使用的 pyside2
。现在换了 M1 的 mac,于是现在准备在自己的电脑上重新安装环境安装环境。结果没想到状况百出。-_-
首先要准备好 Qt 的环境。
brew install qt
brew install qt@5
然后,我就兴致冲冲的准备安装 pyside2 了。当然很熟练的使用了 pip,结果:
后来查到, pyside2
并不支持 M1 的 Mac,所以无法查询到该包。
正在我不知道怎么办的时候,突然灵光一闪。我想起以前用 Manjaro 的使用我可以直接使用 pacman(这是 Manjaro 使用包管理器) 去安装一些 Python 的包。于是我想到 brew 是不是也可以呢?
没想真的有,可以看到有一个
pyside@2
的包,然后我就熟练的使用 brew install pyside@2
安装了它。然后我就用 pip freeze
看了下,并没有 pyside2
,因为以前用 pacman
安装 python 的库的时候, pip
是可以找到的。接着尝试在 ipython 里导入也是失败了。
于是我尝试查看一下 python 库文件的目录,发现并没有包含这个目录。
import sys
print(sys.path)
我们可以通过添加环境变量的方式将其加入其中,让 Python 也查询该目录。
export PYTHONPATH=$PYTHONPATH:/opt/homebrew/Cellar/pyside@2/5.15.2/lib/python3.9/site-packages
完成后,我再次在 ipython 中尝试导入 pyside2,果然成功了。
让后我尝试运行了一个最小 demo,也成功了。
import sys
from PySide2.QtCore import Qt
from PySide2.QtWidgets import QApplication, QLabel
if __name__ == "__main__":
app = QApplication(sys.argv)
label = QLabel("Hello World", alignment=Qt.AlignCenter)
label.show()
sys.exit(app.exec_())
这时我就很兴奋了准备运行项目了。可是万万没想到,又出事了。
因为在项目中使用 QtWebEngineWidgets 组件,而似乎并没有这组件。没办法,我就去 pyside@2 的目录中查看。
可以看到确实没有这个组件,我真的是服了。
然后怎么办呢?于是,我有想到尝试从源码去构建。我先是去官网下载了源码。
这里把地址贴出来。https://download.qt.io/official_releases/QtForPython/pyside2/
然后我进到源码的目录中使用 python setup.py install
安装,由于时 c++,所以在安装前需要先 build, 然后问题就来了…
它先是告诉我找不到 Qt5,ok 我告诉它。
echo 'export PATH="/opt/homebrew/opt/qt@5/bin:$PATH"' >> ~/.zshrc
export LDFLAGS="-L/opt/homebrew/opt/qt@5/lib"
export CPPFLAGS="-I/opt/homebrew/opt/qt@5/include"
然后它又告诉我找不到 clang,没问题,我也告诉它。
export LLVM_INSTALL_DIR=/opt/homebrew/Cella/llvm/11.1.0
终于可以开始编译了,万万没想到又有事。
找不到命名空间,这个问题真的是整的我好惨。于是我全网找寻解决方法,皇天不负有心人,最后我找到了方法。
这个命名空间的定义是在 <math.h>
这个文件中,而 <cmath>
中确实有引入它,但是由于 Mac 的保护机制,并不能成功的引入这个文件。所以需要修改这句引入的语句。
//#include <math.h>
#include </Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/math.h>
在此之前你可能需要 xcode-select --install
,因为查找库的依赖。相信使用 Mac 的同学肯定都安装过,但是苹果可能在系统更新的时候将它卸载掉。-_-
让我们再次安装 pyside2,这次终于可以成功编译了。在我经过了漫长的等待后,已经成功安装了。于是我又兴奋的运行项目,结果还是没有 QtWebEngineWidgets
。感觉白从源码构建了。
当然,如果你不需要这个组件,那么在 brew 安装时就已经可以了。然而我该怎么解决呢?
ok,经过坚持不懈的努力,我又找到了原因。我又去 pyside2 的源码中看看了,是包含 QtWebEngine 相关的源码的。
那么编译时为什么没有加入了,后来我发现是因为 Apple Silicon 版的 Qt5 不包含 QtWebengine。因为Qt中web相关组件依赖x86平台的底层,所以在arm架构中无法使用。