我使用官方河岸网站提供的安装程序在我的win7系统(python 3.3)上全局安装了PyQt5。
然后我创建了一个新的–no-site-packages
virtualenv,其中我在键入pip list
后看到的唯一内容是pip(1.4)和setuptools(0.9.7)。
现在的问题是,我需要在那里安装完整的PyQt5,这似乎不可能使用pip工具。
虚拟环境中的pip install sip
和pip install PyQt5
都会返回错误。
有人可以提供“我该怎么做”的指导,我该怎么做?
我也希望能够从IDLE中使用PyQt5(新的virtualenv),所以
我将tcl文件夹从我的Python 的全局安装复制到我的虚拟环境的位置,并创建了一个快捷方式定位:{location of my virtual enviroment}\Scripts\pythonw.exe C:\Python33\Lib\idlelib\idle.pyw
所以我可以打开virtualenv IDLE而不是全局。 (希望我没有做错任何事情......请纠正。)
答案 0 :(得分:11)
虚拟环境中的“pip install sip”和“pip install PyQt5”都返回错误。
如果你所指的错误是:
Could not find any downloads that satisfy the requirement [pyqt5|sip]
和
No distributions at all found for [pyqt5|sip]
然后这个answer应该阐明这一点。基本上,PyPI只提供主页和/或来源的链接 - 而不是可下载的包或蛋。以下是PyQt5和SIP PyPI页面的链接。我知道包管理器不提供包这似乎很奇怪,但就是这样。
你必须在virtualenv中从源代码下载,编译和安装sip和pyqt5。我希望我能提供详细信息,但我正在解决这个问题。
答案 1 :(得分:3)
我如何在virtualenv工作中使用PyQt5,Python33 Windows7x64:
首先,确保您匹配64或32位版本的所有内容。我正在使用64位平台进行开发,并使用64位版本。我没有用32位对它进行全面测试。请仔细阅读。
确保PyQt5正在进行基础Python33安装:
from PyQt5 import QtCore, QtGui, QtWidgets
创建一个主窗口并启动它。 如果使用PyQt4代码进行测试,则会交换一些类。 (例如在QtGui和QtWidgets中)
从PyQt5导入QtGui,QtWidgets,QtCore
class Main(QtWidgets.QMainWindow):
def __init__(self):
print("Main __init__ fired")
QtWidgets.QMainWindow.__init__(self)
#Setup the UI
print("Setting up UI")
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
def main():
print("fired main()")
#Setup the main application object
app = QtWidgets.QApplication(sys.argv)
window = Main()
window.show()
sys.exit(app.exec_())
#Run GUI
if __name__ == "__main__":
main()
如果您收到此错误“..无法启动,无法找到或加载Qt平台插件”窗口。“(或类似),您必须更新DirectX。通过Microsoft执行此操作
一旦你完全确定PyQt5在Windows中运行,那么继续。
确保可以从virtualenv中导入PyQt5。您可能需要根据所使用的IDE来操作路径。在virtualenv中运行导入
来自PyQt5导入QtCore,QtGui,QtWidgets
尝试从此virtualenv
OH NO! dlls的另一个错误!是什么给出的?在virtualenv中,QT dll库的路径是错误的。即使你告诉PyQt5直接安装到你的virtualenv也会发生这种情况。在创建QApplication对象之前,必须添加到libraryPaths的路径。这是一个解决方案(将 venv 替换为您的virtualenv路径):
def main():
print("fired main()")
#ADD THE FOLLOWING BEFORE CREATING A QApplication()
QtCore.QCoreApplication.setLibraryPaths(['C:/venv/Lib/site-packages/PyQt5/plugins'])
#Ensure path was added and correct
print(QtCore.QCoreApplication.libraryPaths())
#Setup the main application object
app = QtWidgets.QApplication(sys.argv)
#See what the paths were
print(app.libraryPaths())
window = Main()
window.show()
sys.exit(app.exec_())
现在代码应该从你的virtualenv内部运行。您可以从基本安装中删除PyQt5目录,或者将来将其移动到其他位置。
最有可能以相对的方式对路径进行样板处理,但这可能会导致cx-freeze出现问题。说到这个。
现在你已经完成了所有内容,然后你将你的PyQt5应用程序cx冻结成一个很好的exe。你去运行它和 OH NO!更多dll麻烦。
您可以手动将 libEGL.dll 从site-packages / PyQt5复制到应用程序的根目录构建文件夹,或将以下行添加到您的setup.py文件中以获取cx-freeze:
import sys
from cx_Freeze import setup, Executable
#ADD THIS MUST INCLUDE FOR Windows 7.
include_files = [('c:/venv/Lib/site-packages/PyQt5/libEGL.dll', 'libEGL.dll')]
setup(
name="My App",
version="0.1",
description="PyQt5 App.",
#ADD THIS
options={'build_exe': {'include_files': include_files}},
executables=[Executable("c:/venv/src/myApp_main.py",
base="Win32GUI",
targetName="MyApp.exe")])
答案 2 :(得分:3)
假设你已经全局安装了PyQt5,你可以通过一种方式在不使用--system-site-packages
的情况下让你的virtualenv访问它。名为vext的程序包使其成为可能。它也适用于其他软件包,但在这种情况下,我们只是设置PyQt5支持。
从你的virtualenv中运行以下命令,你应该好好去:
pip install vext.pyqt5
要检查状态,请运行vext -l
。你应该看到如下内容:
Running in virtualenv [enabled]
pyqt5.vext
或者,运行vext -c pyqt5.vext
。你应该看到如下内容:
import sip: [success]
import PyQt5: [success]
或者你可以尝试导入PyQt5,例如python -c 'import PyQt5'
。
答案 3 :(得分:0)
我遇到了安装PyQt5和SIP的相同问题。解决Is it possible to add PyQt4/PySide packages on a Virtualenv sandbox?上指定的PyQt4问题的解决方案对我有用。
我从virtualenv / site-packages目录中手动创建符号链接到PyQt5和sip.so。一个丑陋的解决方案,但让事情有效。
答案 4 :(得分:0)
Anon的添加Qt libraryPath的解决方案对我有用。我在Windows上使用Anaconda3。但我找到了另一种选择。
将文件…\Anaconda3\qt.conf
复制到虚拟环境中的Scripts
文件夹。现在我不需要更改任何Python代码。
conf文件似乎是由…\Anaconda3\Scripts\.qt-post-link.bat
创建的。