在Ubuntu上使用本地FAF(QtWebKit在Ubuntu 17.04+上)

我正在尝试在本地环境下同时运行FAF和FA(通过Wine)。
(由于这篇帖子的浏览量以及方法的更新程度,我决定更新这个问题,以便回答和提问。请查看此帖子的修订历史,了解旧方法运行Python客户端和旧指南的过程。)

Beta状态的Java客户端:

enter image description here

使用此脚本:(更新于2019年3月12日)

https://github.com/tatsujb/installFAFscript

https://www.youtube.com/watch?v=BEWUEoQ8Q4k


Python客户端:(现已过时)

working FAF

如何:从源代码编译这个Python应用程序(FAF):

感谢@edwinksl的“Python 3 with PyQt5”指南,让我能够运行起来。我将他标记为解决方案。干得好!

更新(2018年1月31日)

对不起,我花了这么长时间才更新这篇文章。它已经有7000次浏览了!它真的值得提供最新的信息。

自从我提问以来发生了很多事情。FAF现在基本上支持Linux。他们甚至有一个维基页面来安装它(还有按发行版分类!):

https://wiki.faforever.com/index.php?title=Setting_Up_FAF_Linux#Debian.2FUbuntu

不能保证能满足你的需求,可以通过深入挖掘找到更多信息:http://forums.faforever.com/viewtopic.php?f=2&t=4507

目前维基百科并不是非常更新。

有一段时间我可以使用原生Python来运行FAF,不需要虚拟环境,但是QT的依赖关系和软件包组成以及FAF对它们的使用已经再次破坏了这一点...暂时希望如此!

请放心,我已经成功运行,并且在这里提供安慰(首先尝试跳过步骤6和7,它们可能是不必要的):

安装一些先决条件:sudo apt update && sudo apt install wget PyQt5.QtMultimedia python3-idna python3-semantic-version python3-pyqt5 python3-pyqt5.qtwebengine cd Downloads && wget https://github.com/FAForever/client/archive/0.16.1.tar.gz (或者最新版本在https://github.com/FAForever/client/releases/)
解压缩(这个例子中我将解压到主目录)(cd Downloads/ && mv client-0.16.1.tar.gz ~/ && cd && tar -zxf client-0.16.1.tar.gz && mv client-0.16.1 faf-client && rm client-0.16.1.tar.gz)
cd fafclient/:切换到工作目录
sed -i 1,1d requirements.txt:从要求中删除cxFreeze(它不是必需的,而且会导致编译失败)
virtualenv -p python3 faf pip install -r requirements.txt
sudo wget https://github.com/FAForever/uid/releases/download/v4.0.5/faf-uid -O /usr/bin/faf-uid:下载登录二进制文件并使用sudo chmod +x /usr/bin/faf-uid允许faf执行它。
touch res/RELEASE-VERSION && echo "0.16.1" >> res/RELEASE-VERSION:满足faf的最后一个要求:一个发布版本文件。
现在它应该可以运行了,但为了好玩,让我们做一个跑步者:
touch FAF.sh
echo "#! /bin/bash" >> FAF.sh
echo "cd /home/t/faf-client" >> FAF.sh
echo "python3 src/__main__.py" >> FAF.sh
chmod +x FAF.sh

然后运行 ./FAF.sh 来启动 FAF。
干杯!

请访问https://wiki.qt.io/Building_Qt_5_from_Git。如果您仍然遇到问题,请直接联系qtwebkit的维护人员。 - Panther
t@tsu:~$ sudo apt-get build-dep qt5-default Reading package lists... Done E: You must put some 'source' URIs in your sources.list - tatsu
将源URI放在- https://askubuntu.com/questions/496549/error-you-must-put-some-source-uris-in-your-sources-list - Panther
我在那个页面上运行了除了“便利包(仅适用于Ubuntu 11.10 - 12.10)”之外的所有命令,但FAF崩溃问题仍然存在。还有t@tsu:~$ whereis qtwebkit qtwebkit: - tatsu
很不幸,但我发现在过去编译qt应用程序时非常困难和令人沮丧。请向上游提交一个错误报告。 - Panther
好的。在添加源并更新之后,当我执行以下命令时: sudo apt-get build-dep qt5-default 我收到的错误信息是: E: 无法修复问题,您有损坏的软件包。 这是因为我安装了很多随机编译的Qt和其他软件包,还是其他原因导致的?实际上,这些软件包并没有真正损坏,因为升级和安装仍然可以正常工作。 - tatsu
这取决于情况。构建Qt一直是个麻烦,因为它在快速发展中,依赖项并不总是在Ubuntu的特定版本中都可用。不过,你需要调试那个警告。 - Panther
也由于我对这个不熟悉,我不知道那个错误报告在哪里。可以给我一个链接吗? - tatsu
http://wiki.qt.io/Reporting_Bugs - Panther
这是一个QT Web浏览器的bug还是一个QT的bug,我选择QT。 - tatsu
有Python(Python2)和Python3两个版本。你确定安装的是正确的版本吗?Ubuntu正在从Python2转向Python3,所以根据Ubuntu的版本,你可能会有其中一个或两个版本。但是无论哪个版本的Ubuntu,都可以安装其中任意一个版本。那么这个程序是基于哪个版本的Python开发的呢? - oldfred
这个程序肯定是Python2的...所以我为什么要使用virtualenv。据我所知,在Ubuntu 11+上编译Python2就像自杀一样。 - tatsu
@oldfred 嘿,我更新了原帖,你能告诉我你对这种新方法的看法吗?QT漏洞报告的人建议我使用这个方法,但我也无法让它正常工作。 - tatsu
我从来没有编译过任何东西。但是我认为我正在使用这个,并且已经通过Ubuntu软件仓库使用synaptic安装了它。python3-pyqt5.qtwebkit - oldfred
@oldfred 在我的原帖中我说过我已经尝试了这个。但是并没有产生任何结果。也许这意味着需要在虚拟环境中安装qtwebkit? - tatsu
从来没有使用过virtualenv,所以不知道。 - oldfred
2@tatsu 我想我成功地让QtWebKit工作了,但是我没有FAF游戏,所以无法完全验证这是否有效。让我试着建立一个聊天室,这样我们就可以讨论了。 - edwinksl
2@tatsu 同时,我写了一个答案。试试看,看它是否有帮助。 - edwinksl
@tatsu 你最新的错误日志显示 _clientwindow.py 正在尝试从 PyQt4 导入 QtWebKit,这是问题的原因。请尝试改为从 PySide 导入 QtWebKit - edwinksl
@edwinksl 我完全是个新手,对这个事情一窍不通。我该怎么做呢?x) - tatsu
2个回答

注意:使用Python 3和PyQt5的步骤已经被证明有效,而使用Python 2和PyQt4以及PySide的步骤仍然是实验性的。
Python 3与PyQt5(已被证明有效)
看起来FAForever/client GitHub存储库的474-feature-py3分支使用了Python 3和PyQt5,其中包含了QtWebKit。因此,使用这个分支是最直接的解决方案。请注意,PyQt5(但不包括PyQt4)实际上可以使用pip安装,这样会更加方便。
Python 3与PyQt5的步骤:
  1. 进入您选择的目录,这里我们将使用~/Desktop/temp作为示例,执行以下命令:git clone FAForever/client GitHub 仓库,并切换到474-feature-py3分支:

    mkdir ~/Desktop/temp
    cd ~/Desktop/temp
    git clone https://github.com/FAForever/client.git faf-client
    cd faf-client
    git checkout 474-feature-py3
    
  2. 创建并激活 Python 3 的虚拟环境(Ubuntu 17.04 默认为 Python 3.5),并强制升级 pip 以确保其为最新版本:

    virtualenv venv -p python3  # 如果要使用 Python 3.6,请将 python3 替换为 python3.6
    source venv/bin/activate
    pip install -U --force-reinstall pip
    
  3. 使用 pip 安装 PyQt5requirements.txt 中的依赖:

    pip install PyQt5
    pip install -r requirements.txt
    
  4. faf-uid 二进制文件下载到 faf-client/lib 目录,并设置可执行权限:

    wget https://github.com/FAForever/uid/releases/download/v4.0.4/faf-uid -O lib/faf-uid
    chmod +x lib/faf-uid
    
  5. 运行 src/__main__.py 文件:

    python src/__main__.py
    

使用Python 2与PyQt4和PySide(实验性)

看起来我可能已经找到了如何导入QtWebKit模块的方法,但是我没有安装FAF游戏,所以无法完全验证这是否有效,因此这个答案还在进行中。

简而言之,我使用了apt来安装python-qt4,但它没有QtWebKit模块。我创建并激活了一个虚拟环境,没有使用--system-site-packages选项,并使用pip安装了PySide,它有QtWebKit模块。然后,我将适当的系统库和文件的符号链接到了虚拟环境中的PyQt4。接着,我对faf-client/src进行了一些更改,从PySide导入了QtWebKit模块。这个解决方案受到了https://stackoverflow.com/a/28850104/486919https://stackoverflow.com/a/36887302/486919https://stackoverflow.com/a/37616466/486919的启发。
步骤:
  1. 安装 python-qt4:

    sudo apt update
    sudo apt install python-qt4
    
  2. cd 到你选择的目录,这里为了回答问题方便,我们假设目录是 ~/Desktop/temp,然后 git clone 我的版本库,并且 git checkoutpatch 分支:

    mkdir ~/Desktop/temp
    cd ~/Desktop/temp
    git clone https://github.com/edwinksl/client.git faf-client
    cd faf-client
    git checkout patch
    

    这个 patch 分支相比默认的 develop 分支有几个额外的提交: 1) 它去掉了对 cx_Freeze 的版本规定,因为之前指定的 4.3.4 版本在安装时出现问题,2) 它从 PyQt4 中导入 QtWebKit 而不是 PySide

  3. 创建并激活一个用于 Python 2 的虚拟环境,并强制升级 pip 确保它是最新的:

    virtualenv venv
    source venv/bin/activate
    pip install -U --force-reinstall pip
    
  4. 使用 pip 安装 PySiderequirements.txt 中的依赖:

    pip install PySide
    pip install -r requirements.txt
    
  5. faf-uid 二进制文件下载到 faf-client/lib 目录,并使其可执行:

    wget https://github.com/FAForever/uid/releases/download/v4.0.4/faf-uid -O lib/faf-uid
    chmod +x lib/faf-uid
    
  6. cd 到虚拟环境中的 site-packages 目录,并创建适当的符号链接:

    cd venv/lib/python2.7/site-packages
    ln -s /usr/lib/python2.7/dist-packages/PyQt4/ .
    ln -s /usr/lib/python2.7/dist-packages/sip.x86_64-linux-gnu.so .
    

    注意每个符号链接末尾的 .

  7. cd 回到 faf-client 目录,然后在 src/__main__.py 上运行 python:

    cd -  # 这会返回上一个目录,应该是 ~/Desktop/temp/faf-client
    python src/__main__.py
    

首先,非常感谢!对不起,我错过了队列。我住院了。我卡在这里: 正在解决差异:100%(8873/8873),完成。 t@tsu:~/Desktop/temp$ git checkout patch 致命错误:不是一个git仓库(或任何父目录):.git t@tsu:~/Desktop/temp$ git init 在/home/t/Desktop/temp/.git/中初始化空的Git仓库。 t@tsu:~/Desktop/temp$ git checkout patch 错误:路径规范“patch”与git已知的任何文件不匹配。 - tatsu
@tatsu 我错了。你需要先进入faf-client目录,然后执行git checkout patch命令。 - edwinksl
@edwinskl 是的!一旦完成,就进行光盘备份! - tatsu
@edwinskl 在执行 pip install -r faf-client/requirements.txt 后,我添加了以下命令:wget https://github.com/FAForever/uid/releases/download/v4.0.4/faf-uid -O ./faf-client/lib/faf-uidchmod +x ./faf-client/lib/faf-uid,然后执行了以下命令:cd ./faf-client && ../venv/bin/python src/__main__.py根据原始教程论坛帖子的说明进行了脚本构建:http://forums.faforever.com/viewtopic.php?f=2&t=4507&start=200#p139389FAF运行起来了,但仍有错误日志。 - tatsu
@tatsu 随意提出修改建议!毕竟你已经安装了游戏,而我没有... - edwinksl
@edwinski 我觉得我接近成功了。也许指针不起作用是因为我没有清晰的软件包设置,我正在卸载所有之前安装的内容。由于整个系统都需要 libqt4 或 libqt5 软件包,所以删除它们似乎是不可能的。我可以排除它们对干扰的可能性吗? - tatsu
只要你在创建虚拟环境时没有使用--system-site-packages标志,那么全局安装的qt4和qt5不会影响到虚拟环境。 - edwinksl
让我们在聊天中继续这个讨论。 - edwinksl
对于Python3:(venv) t@tsu:~/faf/faf-client$ python src/__main__.py Traceback (most recent call last): File "src/__main__.py", line 52, in <module> import util File "/home/t/faf/faf-client/src/util/__init__.py", line 12, in <module> from semantic_version import Version ImportError: No module named 'semantic_version' - tatsu
@tatsu semantic_version 明显在 requirements.txt 中,所以这个错误非常意外。确保你按照每一步正确操作。 - edwinksl
是的!就是这样! - tatsu

检查 ~/.bashrc 文件以确定 Python 版本覆盖。
要编译所需的软件包需要 Python 版本 2.7.x。请使用以下命令确认:
$ python
Python 2.7.12 (default, Nov 19 2016, 06:48:10) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import PyQt4
>>> print PyQt4.__path__
['/usr/lib/python2.7/dist-packages/PyQt4']
>>> 

这是这个问答中的问题。

你在搜索“linux error PyQt4 import QtWebKit”时并不孤单:

很不幸,谷歌搜索结果还有很多,但我相信这些是你最应该阅读的,如果第一个建议行不通的话。

谢谢,但我不确定是我没有理解还是其他原因,但我正在使用virtualenv(我相信)这帮助我避免在本地安装Python2。鉴于这一点,我不应该担心Python3干扰任何事情。如果我完全错了,请纠正我。 - tatsu