Outils pour utilisateurs

Outils du site


pyqt4_et_pyqt5_sous_windows

Avoir en même temps PyQt4 et PyQt5 sous Windows

[Python 3.4]

[Modification le 16/4/2015: simplifications]

Problématique

PyQt vient de passer de la version 4 à la version 5 avec une rupture de compatibilité: les programmes PyQt4 doivent être modifiés pour être utilisés avec PyQt5. Sous Windows, il faudrait donc, pendant quelques mois, pouvoir en même temps:

  • maintenir les développements actuels en PyQt4,
  • préparer progressivement leur conversion en PyQt5,
  • et développer les nouveaux programmes directement PyQt5

Le problème est que sous Windows on utilise le plus souvent les binaires (.exe) pour installer, et que l'éditeur de PyQt (Riverbank) dit qu'il n'est pas possible d'avoir en même temps PyQt4 et PyQt5! La seule possibilité pour ça serait de reconstruire PyQt4 et PyQt5 à partir des sources et avec la même version de sip: ce qui est beaucoup plus compliqué (compilation C++)!

La solution ci-dessous permet de faire mentir l'éditeur: on aura bien PyQt4 et PyQt5 opérationnels en même temps sous le même Windows!

Comme il s'agit d'installation, il faudra, bien sûr, les droits “administrateur”.

Principe de solution

On va utiliser les “environnements virtuels” qui font partie de Python 3.3 et 3.4 maintenant grâce au module “venv” (les versions antérieures peuvent télécharger des solutions équivalentes).

On considère qu'on a déjà un Python d'installé avec PyQt4, ainsi que tous les modules dont on a besoin. On va utiliser un “environnement virtuel” pour installer PyQt5 en plus. Ainsi:

  • l'appel du Python normal aura la disponibilité de PyQt4
  • l'appel du Python de l'environnement virtuel aura la disponibilité de PyQt5, ainsi que de tous les modules du Python normal.

La difficulté principale est que Riverbank a ajouté une sécurité: lorsque PyQt4 est installé, la tentative d'installer en plus PyQt5 échoue, parce que le programme d'installation trouve dans le registre de Windows qu'un PyQt est déjà présent. Le contraire est vrai aussi si on veut installer PyQt4 alors que PyQt5 est déjà installé. On va voir comment contourner cet obstacle!

Cette méthode est issue d'une discussion sur le forum Python de developpez (merci à wiztricks!): http://www.developpez.net/forums/f96/autres-langages/python-zope/.

A noter: on considére ici qu'on a déjà PyQt4 d'installé “normalement” et qu'on crée un environnement virtuel pour mettre PyQt5 en plus, mais on peut aussi faire le contraire: PyQt5 installé normalement et PyQt4 dans l'environnement virtuel. Ce sera d'ailleurs la solution future la plus pratique lorsque PyQt5 sera la bibliothèque “normale” et qu'on voudra avoir PyQt4 “en plus” pour essayer les anciens programmes.

Création et utilisation de l’environnement virtuel

Nous avons, par exemple, le Python 3.4 installé ici: C:\Python34. Il contient déjà PyQt4, ainsi que les modules externes pour couvrir les utilisations qu'on en a, par exemple: scipy, numpy, matplotlib, cython, cx_freeze, etc…

On va créer un environnement virtuel dans un répertoire nommé, par exemple, D:\pyenvqt5 comme suit avec la console de Windows (cmd.exe):

C:\Python34\python.exe -m venv D:\pyenvqt5

On va faire une petite correction du fichier pyvenv.cfg qui se trouve maintenant à la racine de ce répertoire: mettre include-system-site-packages à “true” au lieu de “false”: l'avantage est que les programmes lancés sous cet environnement virtuel auront ainsi accès aux modules externes installés dans le python normal (C:\Python34).

Ça y est: on a l'environnement virtuel destiné à recevoir PyQt5! Ça va, ce n'était pas trop douloureux? ;-)

Quand on regarde ce qu'il y a dedans, on voit qu'il y a les exécutables python dans le sous-répertoire Scripts:

D:\pyenvqt5\Scrips\python.exe
D:\pyenvqt5\Scrips\pythonw.exe

On voit aussi qu'il y a au même endroit pip et easy-install pour installer d'autres modules externes.

On voit enfin qu'il y a le répertoire “Lib\site-packages” qui pourra accueillir des modules externes installés, et en particulier notre PyQt5. Ainsi d'ailleurs que n'importe quel autre module qu'on voudrait installer en plus!

L'utilisation est super-simple: il suffit pour exécuter un programme python quelconque “monprogramme.py” avec le Python de l'environnement virtuel de faire dans une console cmd:

D:\pyenvqt5\Scripts\python.exe monprogramme.py

Pour installer des modules complémentaires soit dans le python normal C:\Python34, soit dans l'environnement virtuel D:\pyenvqt5, il suffit, selon la méthode d'installation:

  • d'utiliser le bon pip (l'environnement virtuel a le sien),
  • ou le bon python.exe si on utilise le setup.py: celui de C\Python34 ou celui de D:\pyenvqt5\Scripts exécutera le “setup.py install” du programme à installer,
  • ou, avec les binaires exe, de donner la bonne adresse d'installation dans le programme d'installation.

Pour détruire l'environnement virtuel, après avoir désinstallé tout ce qu'on y a mis, on fait:

C:\Python34\python.exe -m venv --clear D:\pyenvqt5

Pour en connaître plus sur les environnements virtuels: voir la doc:

https://docs.python.org/3/library/venv.html#module-venv

Installation de PyQt5

On passe maintenant aux choses sérieuses.

Je rappelle que le Python de base n'a ici que PyQt4.

Le PyQt5 en binaire à installer pour Windows est chez riverbank: http://www.riverbankcomputing.co.uk/software/pyqt/intro.

On installe PyQt5 dans D:\pyenvqt5. Attention: au début de l'installation, il y a un mode “Full” qui est proposé qui ne convient pas: il faut sélectionner “Custom”: c'est ça qui permettra de choisir l'adresse où il faut installer qui est “D:\pyenvqt5”.

Mais ça ne marche pas: il trouve l'installation précédente de PyQt4 dans le registre et refuse d'aller plus loin.

En fait, l'installation de PyQt4 a créé dans le registre les clés suivantes: “PyQt4\py3.4\InstallPath” avec la valeur: “C:\Python34”. Sous Windows 8.1 64 bits et Python 3.4 32 bits, ces clés se trouvent dans “HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node”. Pour d'autres configurations, cherchez: le principe est le même.

Alors, on exécute l'éditeur de registre “regedit.exe”, et avec lui, on va mettre à “chaine vide” cette adresse “C:\Python34”! Grâce à ça, l'installation de PyQt5 dans D:\pyenvqt5 se déroulera sans broncher.

Attention: il faudra remettre cette même adresse à “C:\Python34” après l'installation de PyQt5, parce que la désinstallation de PyQt4 (pour mise à jour par exemple) aura absolument besoin de cette adresse.

Il y a un dernier petit travail à faire: apprendre aux 2 PyQt où se trouvent leurs éléments! C'est justifié par le fait que les parties “Qt” contiennent des adresses “codées en dur”, qui sont fausses dans le cas de “PyQt”.On le fait en plaçant un petit fichier texte “qt.conf” dans le répertoire qui contient l'exécutable Python.

Pour le PyQt4 de C:\Python34, le qt.conf sera dans C:\Python34 et contiendra:

[Paths]
Prefix = Lib/site-packages/PyQt4
Binaries = .
Plugins = plugins
Translations = translations

Pour le PyQt5 de D:\pyenvqt5, le qt.conf sera dans D:\pyenvqt5\Scripts et contiendra:

[Paths]
Prefix = ../Lib/site-packages/PyQt5
Binaries = .
Plugins = plugins
Translations = translations

Ça y est: vous avez PyQt4 et PyQt5 en même temps! Il vous suffit d'appeler le “bon python” (celui qui a le bon PyQt) pour exécuter un programme.

A titre de vérification, vous pouvez lancer les démos de PyQt:

pour PyQt4:

C:\Python34\pythonw.exe  C:\Python34\Lib\site-packages\PyQt4\examples\demos\qtdemo\qtdemo.pyw

et pour PyQt5:

D:\pyenvqt5\Scripts\pythonw.exe D:\pyenvqt5\Lib\site-packages\PyQt5\examples\qtdemo\qtdemo.pyw 

A noter:

  • puisque les programmes lancés avec le python de l'environnement virtuel ont accès aux modules externes installés dans le Python “normal” (celui de C:\Python34), on pourrait se dire qu'on a accès aussi à PyQt4: mais ça ne marche pas à cause de ces problèmes d'adresses des répertoires de PyQt placées dans qt.conf.
  • puisqu'on réussi à installer PyQt4 et PyQt5 avec l'astuce de la modification du registre, on peut avoir l'idée d'installer les 2 dans le même Python C:\Python34, mais ça ne marche pas: il y a un fichier sip.pyd dans le répertoire site-packages qui est spécifique à chacun des PyQt. On retrouve bien la condition de Riverbank: pour avoir PyQt4 et PyQt5 en même temps sous Windows, il faut reconstruire (recompiler) à partir des sources avec la même version de sip!

Configuration des appels

Pour exécuter les programmes Python .py et .pyw:

Puisqu'on a toujours le Python “normal” en C:\Python34, il est logique de laisser le branchement des fichiers python sur celui-ci. Ainsi, dans l'explorateur de fichiers Windows:

  • un double clic sur un fichier .py appellera C:\Python34\python.exe,
  • un double clic sur un fichier .pyw appellera C:\Python34\pythonw.exe.

Seuls les programmes python nécessitant PyQt5 devront être lancés impérativement par le python de l'environnement virtuel: D:\pyenvqt5\Scripts\python.exe pour les programmes .py et D:\pyenvqt5\Scripts\pythonw.exe pour les programmes .pyw.

Pour Eclipse + pydev:

On peut avoir 2 workspaces (2 répertoires D:\pydevqt4 et D:\pydevqt5) pour porter les projets de PyQt4 pour l'un et PyQt5 pour l'autre. Et on a sur le bureau 2 icônes de lancement: eclipse_qt4 et eclipse_qt5 avec les workspaces comme argument précédé de l'option “-data”:

C:\eclipse\eclipse.exe -data D:\pydevqt4
C:\eclipse\eclipse.exe -data D:\pydevqt5

Pour chacun de ces workspaces, on fait reconnaître le bon interpréteur Python:

  • pour le workspace D:\pydevqt4, l'interpréteur python est: C:\Python34\python.exe
  • pour le workspace D:\pydevqt5, l'interpréteur python est: D:\pyenvqt5\Scripts\python.exe

Avec la touche “Apply”, pydev cherche les adresses supplémentaires: vérifiez qu'il les a toutes et dans le bon ordre, sinon, modifiez-les:

Pour le workspace D:\pydevqt4 pour le développement avec PyQt4:

C:\Python34
C:\Python34\DLLs
C:\Python34\lib
C:\Python34\Lib\site-packages

Et pour le workspace D:\pydevqt5 pour le développement avec PyQt5:

D:\pyenvqt5
D:\pyenvqt5\Lib
D:\pyenvqt5\Lib\site-packages
C:\Python34
C:\Python34\DLLs
C:\Python34\lib
C:\Python34\Lib\site-packages

Ça y est, vous pouvez travailler sous PyQt4 et PyQt5, et même simultanément à l'écran, car vous pouvez avoir les 2 fenêtres “eclipse” en même temps!

Pour geany:

On peut avoir 2 geany chacun travaillant avec le bon python, et donc la bonne bibliothèque PyQt.

Pour ça, il faut recopier sous un autre nom (geany_qt5 par exemple) le répertoire geany qui se trouve ici dans le home de l'utilisateur en cours (vous!):

C:\Users\utilisateur\AppData\Roaming\geany

On aura ensuite 2 icônes geany sur le bureau: geany_qt4 et geany_qt5 avec les commandes de lancement:

c:\chemin\Geany.exe --new-instance --config=C:\Users\utilisateur\AppData\Roaming\geany
c:\chemin\Geany.exe --new-instance --config=C:\Users\utilisateur\AppData\Roaming\geany_qt5

Il faudra, bien sûr, déclarer le bon Python à utiliser dans chacun de ces cas dans le fichier de configuration “filetypes.common”.

Comme pour eclipse/pydev, on pourra avoir les 2 geany en même temps sur le bureau (c'est l'option “–new-instance” qui permet ça).

Pour idle:

On peut toujours travailler avec l'idle du Python de base C:\Python34, mais, bien sûr, seul PyQt4 sera disponible à l'importation:

C:\Python34\pythonw.exe C:\Python34\Lib\idlelib\idle.pyw

Et pour avoir idle avec PyQt5, il faut lancer le même idle.pyw, mais avec le Python.exe de l'environnement virtuel:

D:\pyenvqt5\Scripts\pythonw.exe C:\Python34\Lib\idlelib\idle.pyw

Pour les exécutables de PyQt:

Il faudra bien sûr appeler les “bons” exécutables:

C:\Python34\Lib\site-packages\PyQt4\assistant.exe
C:\Python34\Lib\site-packages\PyQt4\designer.exe
C:\Python34\Lib\site-packages\PyQt4\linguist.exe
C:\Python34\Lib\site-packages\PyQt4\pyuic4.bat
C:\Python34\Lib\site-packages\PyQt4\pyrcc4.exe

D:\pyenvqt5\Lib\site-packages\PyQt5\assistant.exe
D:\pyenvqt5\Lib\site-packages\PyQt5\designer.exe
D:\pyenvqt5\Lib\site-packages\PyQt5\linguist.exe
D:\pyenvqt5\Lib\site-packages\PyQt5\pyuic5.bat
D:\pyenvqt5\Lib\site-packages\PyQt5\pyrcc5.exe

Etc…


Amusez-vous bien!

pyqt4_et_pyqt5_sous_windows.txt · Dernière modification: 2015/04/17 05:55 de tyrtamos

Outils de la page