能否在Virtualenv虚拟环境中添加PyQt4/PySide包?

59

我在我的开发环境中使用 Virtualenv 成功地与 web.py, simplejson 和其他面向web的包一起使用。
我将要使用Qt编写一个简单的Python客户端,以便重用使用web.py开发的API。

这里有人成功地将 PyQt4 安装到 Virtualenv 中吗?
这是否可能?

我已经下载了所有的二进制文件,并在我的 python2.6 目录下全局安装了 PyQt4
如果我不使用 --no-site-packages 选项,Virtualenv 将正确地将 PyQt4 包含在我的新沙盒中,但显然也包括了我不需要的所有全局包。

有没有一种干净的方法来准备一个带有 --no-site-packages 选项的新沙盒,然后使用 pipeasy_install 或其他魔法技巧添加 PyQt4PySide


1
对于 PySide,只需使用 pip install pyside,无需任何魔法技巧。已在1.2.4上进行了测试。 - anatoly techtonik
13个回答

52

创建一个空的虚拟环境,然后将 .../site-packages/PyQt4 目录的内容复制到其中应该就足够了。

我建议先全局安装 PyQt4,再复制该目录,卸载全局安装,然后使用此技巧创建虚拟环境。


1
谢谢你的帮助。 复制目录后,我可以在命令行中导入PyQt4而没有错误,但是我缺少sip(ImportError:No module named sip)。 我需要复制它吗?你认为pyuic4会起作用吗? - systempuntoout
5
好的,应该可以解决了。我错过了 SIP,因为它在 site-packages 中(没有子目录)。至于 pyuic4,它应该能够正常工作。 - Aaron Digulla
1
我将sip.so复制到沙盒Python目录下的site-packages中,然后它就可以工作了。 - systempuntoout
3
因为在Windows上的标准安装程序会打开一个UI安装程序,不关心virtualenv :-( 在Linux上,这取决于你是自己安装还是从软件包安装。软件包也会忽略virtualenv。我建议你尝试一下,并发布如何使用easy_install进行操作的答案。 - Aaron Digulla
2
你没有说明你是在使用Windows还是Unix。如果你在Windows上并且有一个bdist_wininst安装程序(不是MSI),你可以使用wheel项目的“wheel convert”命令将exe转换为wheel。然后,你可以使用“wheel install”将wheel安装到虚拟环境中。转换步骤只需进行一次,因此你可以保留生成的wheel以供将来所有的虚拟环境使用。 - Paul Moore
显示剩余3条评论

46

我有同样的问题。我使用virtualenvwrapper,所以我编写了这个脚本,在每个新的虚拟环境中创建一个指向PyQt的链接。也许对其他人有用:

#!/bin/bash
# This hook is run after a new virtualenv is activated.
# ~/.virtualenvs/postmkvirtualenv

LIBS=( PyQt4 sip.so )

PYTHON_VERSION=python$(python -c "import sys; print (str(sys.version_info[0])+'.'+str(sys.version_info[1]))")
VAR=( $(which -a $PYTHON_VERSION) )

GET_PYTHON_LIB_CMD="from distutils.sysconfig import get_python_lib; print (get_python_lib())"
LIB_VIRTUALENV_PATH=$(python -c "$GET_PYTHON_LIB_CMD")
LIB_SYSTEM_PATH=$(${VAR[-1]} -c "$GET_PYTHON_LIB_CMD")

for LIB in ${LIBS[@]}
do
    ln -s $LIB_SYSTEM_PATH/$LIB $LIB_VIRTUALENV_PATH/$LIB 
done

链接至Gist


嗨,我通过谷歌找到了你的答案,通过其他人的评论,我觉得你的脚本应该可以工作。我对bash了解非常非常少(我正在使用zsh),你能告诉我如何运行这个脚本吗? - Sean
@Sean 当你创建一个新的虚拟环境时,脚本应该由virtualenvwrapper自动运行。如果你只安装了zsh,你可以用你的zsh可执行文件路径替换脚本的第一行“#!/bin/bash”,可能是“#!/bin/zsh”,你可以用“echo $PATH”获取这个路径。这个第一行是shebang,关于它的解释请看这里:shebang wikipedia。我不使用zsh,但是这个脚本也可能适用于zsh。 - José Luis
1
如果你在使用这个命令时遇到了 VAR: bad array subscript 的错误提示,那么很可能是因为你正在使用旧版本的 bash(Apple 在 10.8 版本中仍然使用 3.2 版本)。不过,你可以轻松地通过 brew install bash 命令安装升级后的版本。 - dmnd
1
这个不起作用。尝试执行“from PyQt4 import pyqtconfig”(这是matplotlib用于检测PyQt4的方法)会导致“没有名为sipconfig的模块”的错误。 - Thomas Johnson
2
你好,我喜欢你的脚本,并将其放在了我的gist中。我的版本应该更加健壮,并且包括sipconfig.py,这使得matplotlib可以正常工作。谢谢。 - Midnighter

29

Linux Debian,Python 2.7:

  • 全局安装python-qt4:sudo apt-get install python-qt4
  • 创建PyQt4的符号链接到你的虚拟环境中:ln -s /usr/lib/python2.7/dist-packages/PyQt4/ ~/.virtualenvs/myEnv/lib/python2.7/site-packages/
  • 创建sip.so的符号链接到你的虚拟环境中:ln -s /usr/lib/python2.7/dist-packages/sip.so ~/.virtualenvs/myEnv/lib/python2.7/site-packages/

8

对于那些想在Python 3虚拟环境(在OSX上)中使用PyQt4的人,首先需要安装PyQt4和SIP(我将使用homebrew)。

$ brew install python3
$ brew install sip --with-python3
$ brew install pyqt --with-python3

然后创建您的虚拟环境。
$ virtualenv ...

最后,创建符号链接(更改您机器上安装的SIP、PyQt4和Python的版本)。

$ ln -s /usr/local/Cellar/sip/4.15.5/lib/python3.4/site-packages/*.* ~/{VIRTUALENVHOME}/{VIRTUALENVNAME}/lib/python3.4/site-packages/
$ ln -s /usr/local/Cellar/pyqt/4.10.4/lib/python3.4/site-packages/PyQt4/*.* ~/{VIRTUALENVHOME}/{VIRTUALENVNAME}/lib/python3.4/site-packages/PyQt4

7

我在irc.freenode.net的#pyside频道上询问是否可以在virtualenv中安装PySide,hugopl回答是肯定的。于是我按照PySide Binaries for Microsoft Windows的说明进行操作,结果成功了。以下是输出内容。

Z:\virtualenv\pyside>Scripts\activate.bat

(pyside) Z:\virtualenv\pyside>where python
Z:\virtualenv\pyside\Scripts\python.exe

(pyside) Z:\virtualenv\pyside>easy_install PySide
install_dir Z:\virtualenv\pyside\Lib\site-packages\
Searching for PySide
Reading http://pypi.python.org/simple/PySide/
Reading http://www.pyside.org
Reading http://www.pyside.org/files/pkg/
Best match: PySide 1.0.0beta1qt471
Downloading http://www.pyside.org/files/pkg/PySide-1.0.0beta1qt471.win32-py2.6.exe
Processing PySide-1.0.0beta1qt471.win32-py2.6.exe
Deleting c:\users\piotr\appdata\local\temp\easy_install-fvfa7e\PySide-1.0.0beta1qt471-py2.6-win32.egg.tmp\EGG-INFO\scripts\py
ide-uic-script.py
Deleting c:\users\piotr\appdata\local\temp\easy_install-fvfa7e\PySide-1.0.0beta1qt471-py2.6-win32.egg.tmp\EGG-INFO\scripts\py
ide-uic.exe
creating 'c:\users\piotr\appdata\local\temp\easy_install-fvfa7e\PySide-1.0.0beta1qt471-py2.6-win32.egg' and adding 'c:\users\
iotr\appdata\local\temp\easy_install-fvfa7e\PySide-1.0.0beta1qt471-py2.6-win32.egg.tmp' to it
creating z:\virtualenv\pyside\lib\site-packages\PySide-1.0.0beta1qt471-py2.6-win32.egg
Extracting PySide-1.0.0beta1qt471-py2.6-win32.egg to z:\virtualenv\pyside\lib\site-packages
Adding PySide 1.0.0beta1qt471 to easy-install.pth file
Installing pyside-uic-script.pyc script to Z:\virtualenv\pyside\Scripts
Installing pyside_postinstall.py script to Z:\virtualenv\pyside\Scripts
Installing pyside_postinstall.pyc script to Z:\virtualenv\pyside\Scripts
Installing pyside-uic-script.py script to Z:\virtualenv\pyside\Scripts
Installing pyside-uic.exe script to Z:\virtualenv\pyside\Scripts

Installed z:\virtualenv\pyside\lib\site-packages\pyside-1.0.0beta1qt471-py2.6-win32.egg
Processing dependencies for PySide
Finished processing dependencies for PySide

(pyside) Z:\virtualenv\pyside>python Scripts\pyside_postinstall.py -install
Generating file Z:\virtualenv\pyside\Scripts\qt.conf...
The PySide extensions were successfully installed.

这对我来说会出现“UnicodeDecodeError: 'ascii' codec can't decode byte 0x92 in position 594: ordinal not in range(128)”的错误。 - tylerthemiler
请注意,这仅适用于Windows操作系统。http://bugs.pyside.org/show_bug.cgi?id=943 - James

6
假设您的虚拟环境名为 myProject,并且您正在使用 virtualenvwrapper。假设您在 Unix 平台上操作。
$ workon myProject
$ pip install --no-install SIP
$ pip install --no-install PyQt
$ cd ~/.virtualenvs/myProject/build/SIP
$ python configure.py
$ make
$ make install
$ cd ~/.virtualenvs/myProject/build/PyQt
$ python configure.py
$ make
$ make install
$ cd && rm -rf ~/.virtualenvs/myProject/build # Optional.

在使用最新的pip和python3 venvs时,需要为pip添加额外的标志,例如:pip install --no-install --allow-external SIP --allow-unverified SIP SIP,但生成的Makefiles仍然有些问题。 - RobotHumans

6

最简单的方法是安装这个:vext.pyqt4

这将把单个系统PyQt4包添加到您的虚拟环境中。

Ubuntu 16.04使用:

sudo apt install python3-pyqt4
mkvirtualenv --python=python3.5 venv
pip install --no-use-wheel vext.pyqt4

这似乎是“正确”的答案,因为它允许您在虚拟环境中使用现有的软件包管理基础设施(pip或pipenv),而无需手动复制或符号链接文件。遗憾的是它不是被接受的答案。顺便说一下,这也适用于通过vext.pyqt5安装的qt5,并且可以通过pipenv install工作(带有警告,但功能似乎正常)。 - bjarchi

4
如果您在Mac上通过brew安装了pyqt(特别是在Mavericks上):
ln -s /usr/local/Cellar/sip/4.15.2/lib/python2.7/site-packages/*.* ~/{VIRTUALENVHOME}/{VIRTUALENVNAME}/lib/python2.7/site-packages
ln -s /usr/local/Cellar/pyqt/4.10.3/lib/python2.7/site-packages/PyQt4/ ~/{VIRTUALENVHOME}/{VIRTUALENVNAME}/lib/python2.7/site-packages/PyQt4
pip install pygments pyzmq 

当然,这些版本文件夹的编号可能随着时间的推移而发生变化。


1
在尝试了网络上每一个可能的解决方案之后,这是唯一一个真正有效的。 - Patrick
谢谢Patrick。很高兴能够帮到你,请尽可能点赞。 :) - James Errico

4
对于PySide 1.2.1和Ubuntu 12.4,
请安装编译器、与Qt相关的软件和Python源代码。
sudo apt-get install cmake qt4-qmake qt-sdk python-dev

使用virtualenvwrapper创建虚拟环境

准备编译 Qt(大约需要 30 分钟)

$ mkvirtualenv ve_name
(ve_name)$ pip install PySide

测试

$ python -c "from PyQt4 import QtCore; print QtCore.PYQT_VERSION_STR"
4.9.1

3
我的解决方法是将 /usr/lib/python2.7/dist-packages 中的 /PyQt4/sip.x86_64-linux-gnu.so 复制到 <VIRTUALENV>/lib/python2.7/site-packages,并更改这些复制文件的所有权权限(因为复制品被 root 拥有)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接