Cómo instalar PyQt5 en un nuevo virtualenv y trabajar en un IDLE

Instalé PyQt5 globalmente en mi sistema win7 (python 3.3), usando el instalador provisto desde el sitio web oficial de riverbank.

Luego creé un nuevo virtualenv de –no-site-packages , donde las únicas cosas que veo en la lista después de escribir la pip list , son pip (1.4) y setuptools (0.9.7).

El problema ahora, sin embargo, es que necesito instalar allí el PyQt5 completo también, y esto parece imposible con la herramienta pip.

Tanto pip install sip como pip install PyQt5 en el entorno virtual están devolviendo errores.

¿Puede alguien proporcionar una guía de “cómo hacer” de qué debo hacer exactamente?

También quiero poder trabajar con ese PyQt5 (del nuevo virtualenv) desde un IDLE, así que copié la carpeta tcl de la instalación global de mi Python a la ubicación de mi entorno virtual y también creé una orientación de acceso directo: {location of my virtual enviroment}\Scripts\pythonw.exe C:\Python33\Lib\idlelib\idle.pyw para que pueda abrir el {location of my virtual enviroment}\Scripts\pythonw.exe C:\Python33\Lib\idlelib\idle.pyw virtualenv y no el global. (Espero no haber hecho nada malo allí … corrección, por favor).

Tanto “pip install sip” como “pip install PyQt5” dentro del entorno virtual están devolviendo errores.

Si los errores a los que te refieres son:

Could not find any downloads that satisfy the requirement [pyqt5|sip]

y

No distributions at all found for [pyqt5|sip]

Entonces esta respuesta debería arrojar luz sobre esto. Básicamente, PyPI solo proporciona un enlace a la página de inicio y / o fuente, no a un paquete o huevo descargable. Aquí están los enlaces a las páginas PyQt5 y SIP PyPI. Sé que parece extraño que un administrador de paquetes no proporcione paquetes, pero así es como es.

Tendrá que descargar, comstackr e instalar sip y pyqt5 desde la fuente, dentro de su virtualenv. Desearía poder proporcionar detalles, pero actualmente estoy trabajando en esto.

Cómo obtuve mi PyQt5, Python33 Windows7x64 dentro de un virtualenv funcionando:

En primer lugar, asegúrese de que haya combinado las versiones de 64 o 32 bits de todo. Estoy desarrollando en una plataforma de 64 bits y estoy usando versiones de 64 bits. No probé completamente esto con 32 bits. Por favor, lea detenidamente.

  • Instalé Python33 x64 usando los binarios del instalador de Windows.
  • Instalé PyQt5 x64 desde riverbank usando el instalador de MSI en el Python33 predeterminado . PIP no funcionará.
  • Cree un virtualenv utilizando Python33 como su base, sin paquetes de sitios .
  • Copie la carpeta PyQt5 de Python33 / Lib / site-packages / en su virtualenv / Lib / site-packages.
  • NO BORRAR LA carpeta PyQT5!

Asegúrese de que PyQt5 esté funcionando en la instalación básica de Python33:

 from PyQt5 import QtCore, QtGui, QtWidgets 

Crear una ventana principal y lanzarla. Si se prueba con el código PyQt4, se han intercambiado algunas clases. (Dentro de QtGui y QtWidgets por ejemplo)

desde PyQt5 importar 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() 

Si aparece este error “.. no se pudo iniciar, no se pudo encontrar o cargar el complemento de la plataforma Qt” windows “ (o similar), DEBE ACTUALIZAR su DirectX. Hágalo a través de Microsoft.

Una vez que esté completamente seguro de que PyQt5 está funcionando dentro de Windows, continúe.

  • Active su virtualenv donde copió la carpeta PyQt5
  • Asegúrese de que PyQt5 se pueda importar desde su virtualenv. Es posible que deba manipular las rutas según el IDE que esté utilizando. Ejecutar una importación en su virtualenv

    de PyQt5 importar QtCore, QtGui, QtWidgets

  • Intente ejecutar la misma aplicación de nuevo desde este virtualenv

¡OH NO! Otro error con dlls! ¿Lo que da? Las rutas a las bibliotecas dll QT son incorrectas dentro de virtualenv. Ocurre incluso si le dices a PyQt5 que se instale directamente en tu virtualenv. DEBE agregar las rutas a libraryPaths antes de crear el objeto QApplication. Aquí hay una solución (Reemplace venv con su ruta 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_()) 

Ahora el código debería ejecutarse desde todo dentro de tu virtualenv. Puede eliminar el directorio PyQt5 de su instalación base o moverlo a otro lugar si lo necesita en el futuro.

Es muy probable que haya una manera de cambiar el camino de una manera relativa, pero esto podría crear un problema con cx-freeze. Hablando de que.

Ahora está todo listo y va a congelar su aplicación PyQt5 en un exe agradable. Vas a ejecutarlo y ¡ OH NO! más problemas dll.

Puede copiar manualmente libEGL.dll desde site-packages / PyQt5 a la carpeta de comstackción raíz de su aplicación, o agregar las siguientes líneas a su archivo setup.py para 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")]) 

Suponiendo que tiene PyQt5 instalado globalmente, hay una manera de darle acceso virtualenv a él sin usar --system-site-packages . Un paquete llamado vext lo hace posible. También funciona con otros paquetes, pero en este caso solo configuraremos el soporte de PyQt5.

Ejecute el siguiente comando desde su virtualenv y debería estar listo:

 pip install vext.pyqt5 

Para verificar el estado, ejecute vext -l . Deberías ver algo como lo siguiente:

 Running in virtualenv [enabled] pyqt5.vext 

O ejecute vext -c pyqt5.vext . Deberías ver algo como lo siguiente:

 import sip: [success] import PyQt5: [success] 

Alternativamente, puede intentar importar PyQt5, por ejemplo, python -c 'import PyQt5' .

Me enfrenté al mismo problema al instalar PyQt5 y SIP. La solución para resolver este problema para PyQt4 como se especifica en ¿Es posible agregar paquetes PyQt4 / PySide en un sandbox de Virtualenv? trabajó para mi.

Creé manualmente enlaces simbólicos a PyQt5 y sip.so desde dentro del directorio virtualenv / site-packages. Una solución fea pero hace que las cosas funcionen.

La solución de Anon de agregar una Qt libraryPath funcionó para mí. Estoy usando Anaconda3 en Windows. Pero encontré una alternativa.

Copie el archivo …\Anaconda3\qt.conf a la carpeta Scripts en el entorno virtual. Ahora no necesito cambiar ningún código de Python.

El archivo conf parece haber sido creado por …\Anaconda3\Scripts\.qt-post-link.bat .