IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PyQt Python Discussion :

Avoir en même temps PyQt 4 et PyQt 5 avec les environnements virtuels sous Windows ?


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut Avoir en même temps PyQt 4 et PyQt 5 avec les environnements virtuels sous Windows ?
    Bonjour,

    Même si je code en multiplateforme (Windows-Linux-MacOSX), je développe surtout sous Windows (8.1 actuellement). Je suis actuellement avec Python 3.4.

    J'ai installé PyQt4 avec le binaire .exe de riverbank. Et j'en ai besoin pour plusieurs programmes.

    J'aimerais bien pouvoir travailler en plus avec PyQt5. Mais riverbank dit que ce n'est pas possible (sauf si on recréé les 2 à partir des sources mais je ne veux pas faire ça).

    Ma question: pourrais-je avoir en même temps PyQt4 et PyQt5 grâce aux environnements virtuels (pyvenv)?.

    Par exemple, n'avoir aucun PyQt avec le Python normal, avoir PyQt4 dans l'un des environnements virtuels et PyQt5 dans l'autre. Il suffirait d'activer l'un ou l'autre de ces environnements (activate) pour avoir le "bon" PyQt: Quelqu'un a-t-il déjà fait ça? est-ce possible avec les binaires .exe de riverbank?

    Merci d'avance!

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 675
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 675
    Par défaut
    Salut,

    Citation Envoyé par tyrtamos Voir le message
    J'aimerais bien pouvoir travailler en plus avec PyQt5. Mais riverbank dit que ce n'est pas possible (sauf si on recréé les 2 à partir des sources mais je ne veux pas faire ça).
    Techniquement c'est "possible" si les 2 partagent la même version de "sip" mais... cela suppose de faire soi-même le build.

    Citation Envoyé par tyrtamos Voir le message
    Ma question: pourrais-je avoir en même temps PyQt4 et PyQt5 grâce aux environnements virtuels (pyvenv)?.
    Le soucis est que le kit de riverbank trouve dans la registry la dernière version de Python installée et s'il y trouve PyQt4, il s'arrête avec un message d'erreur.
    La solution est de hacker la registry pour que le kit trouve le "bon" environnement Python (i.e. celui du venv).

    Et çà se résume à ce script adapté à Python3 par mes soins.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    # script to register Python 2.0 or later for use with win32all
    # and other extensions that require Python registry settings
    #
    # Adapted by Ned Batchelder and Alex Waters from a script
    # written by Joakim Low for Secret Labs AB / PythonWare
    #
    # source:
    # http://www.pythonware.com/products/works/articles/regpy20.htm
     
    import sys
     
    from winreg import *
    import ctypes
    import ctypes.wintypes
    import os.path
     
    # tweak as necessary
    version = sys.version[:3]
    installpath = sys.prefix
     
    regpath = "SOFTWARE\\Python\\Pythoncore\\%s\\" % (version)
    installkey = "InstallPath"
    pythonkey = "PythonPath"
    pythonpath = "%s;%s\\Lib\\;%s\\DLLs\\" % (
        installpath, installpath, installpath
    )
     
    def RegisterPy():
        try:
            reg = OpenKey(HKEY_LOCAL_MACHINE, regpath)
        except EnvironmentError:
            try:
                reg = CreateKey(HKEY_LOCAL_MACHINE, regpath)
            except Exception as e:
                print ("*** Unable to register: %s" % e)
                return
     
        SetValue(reg, installkey, REG_SZ, installpath)
        SetValue(reg, pythonkey, REG_SZ, pythonpath)
        CloseKey(reg)
        print ("--- Python %s at %s is now registered!" % (version, installpath))
        input('Press any key...')
     
     
    class SHELLEXECUTEINFO(ctypes.Structure):
        _fields_ = (
            ("cbSize",ctypes.wintypes.DWORD),
            ("fMask",ctypes.c_ulong),
            ("hwnd",ctypes.wintypes.HANDLE),
            ("lpVerb",ctypes.c_char_p),
            ("lpFile",ctypes.c_char_p),
            ("lpParameters",ctypes.c_char_p),
            ("lpDirectory",ctypes.c_char_p),
            ("nShow",ctypes.c_int),
            ("hInstApp",ctypes.wintypes.HINSTANCE),
            ("lpIDList",ctypes.c_void_p),
            ("lpClass",ctypes.c_char_p),
            ("hKeyClass",ctypes.wintypes.HKEY),
            ("dwHotKey",ctypes.wintypes.DWORD),
            ("hIconOrMonitor",ctypes.wintypes.HANDLE),
            ("hProcess",ctypes.wintypes.HANDLE),
        )
     
    def need_admin():
        ShellExecuteEx = ctypes.windll.shell32.ShellExecuteEx
        ShellExecuteEx.restype = ctypes.wintypes.BOOL
        sei = SHELLEXECUTEINFO()
        sei.cbSize = ctypes.sizeof(sei)
        sei.lpVerb = b"runas"
        sei.lpFile = sys.executable.encode()
        sei.lpParameters = os.path.abspath(__file__).encode()
        sei.nShow = 1
        ShellExecuteEx(ctypes.byref(sei))
     
     
    if __name__ == "__main__":
        try:
            RegisterPy()
        except WindowsError as e:
            if e.errno == 13:
                need_admin()
            else:
                raise
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour wiztricks,

    Merci pour le code! C'est très intéressant.

    Mais comme je n'aime pas trop bidouiller dans les fichiers de registres, j'ai essayé de trouver une manip qui ne le nécessite pas. Je reviendrai au code si je n'y arrive pas.

    Voilà l'état de mes recherches: ça a l'air de marcher!

    Principe général: je me suis dit que l'inscription au registre lors de l'installation de PyQt4 et PyQt5 n'était utile que pour l'installation et non l'exécution.

    Alors, voilà comment je m'y prends:

    - je désinstalle PyQt4 du python installé "normal" (c:\python34)

    - je crée 2 environnements virtuels avec venv: d:\pyenvqt4 et d:\pyenvqt5

    - j'installe PyQt4 dans d:\pyenvqt4 (lors de l'installation, je demande "custom" au lieu de "full" pour pouvoir donner la bonne adresse)
    - je recopie le répertoire d:\pyenvqt4\Lib\site-packages\PyQt4 et le fichier d:\pyenvqt4\Lib\site-packages\sip.pyd (ne pas oublier!) dans un répertoire temporaire
    - je désinstalle PyQt4
    - je remets à sa place initiale d:\pyenvqt4\Lib\site-packages\PyQt4 et d:\pyenvqt4\Lib\site-packages\sip.pyd

    - j'installe PyQt5 dans d:\pyenvqt5 (lors de l'installation, je demande "custom" au lieu de "full" pour pouvoir donner la bonne adresse)
    - je recopie le répertoire d:\pyenvqt5\Lib\site-packages\PyQt5 et le fichier d:\pyenvqt5\Lib\site-packages\sip.pyd (ne pas oublier!) dans un répertoire temporaire
    - je désinstalle PyQt5
    - je remets à sa place initiale d:\pyenvqt5\Lib\site-packages\PyQt5 et d:\pyenvqt5\Lib\site-packages\sip.pyd

    Dans les 2 cas, il faut corriger l'emplacement et les adresses de qt.conf qui sont incorrectes, sinon, les fichiers de traduction ainsi que les pilotes SGBDR ne sont pas trouvés: ce fichier qt.conf doit se trouver dans le répertoire de python.exe, et contenir (mettre le bon répertoire PyQt4 ou PyQt5):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    [Paths]
    Prefix = ../Lib/site-packages/PyQt4
    Binaries = .
    Plugins = plugins
    Translations = translations
    Et c'est tout!

    Si j'ai à lancer un programme PyQt4 "monprogramme.pyw", je le fais comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    d:\pyenvqt4\Scripts\pythonw.exe monprogramme.pyw
    Et si c'est un programme PyQt5:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    d:\pyenvqt5\Scripts\pythonw.exe monprogramme.pyw
    J'ai essayé différents programmes en PyQt4, ainsi que les démos de PyQt4 et PyQt5: pas de problème à condition, bien sûr, d'utiliser le bon python!

    J'ai configuré eclipse + Pydev avec 2 workspaces, l'un avec d:\pyenvqt4\Scripts\python.exe et l'autre avec d:\pyenvqt5\Scripts\python.exe: tout se passe bien.

    J'ai essayé d'installer un module avec pip dans l'un et l'autre environnement (puisqu'ils ont chacun un pip): ça marche.

    Les modules installés dans le python de base c:\python34 sont mis à disposition des 2 environnements virtuels.

    Bref, jusqu'à présent, je n'ai pas trouvé d'inconvénient à cette manière de travailler, à part qu'il ne faut pas se tromper de python selon ce qu'on veut faire.

    Vois-tu un problème auquel je n'aurais pas pensé?

    Merci!

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 675
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 675
    Par défaut
    Salut,

    Citation Envoyé par tyrtamos Voir le message
    Principe général: je me suis dit que l'inscription au registre lors de l'installation de PyQt4 et PyQt5 n'était utile que pour l'installation et non l'exécution.
    Tout à fait: lors de l'exécution ça passe par file system et infos stockés dans des fichiers en dur. Des trucs sur lesquels Python pourra compter quel que soit l'environnement d'execution (l'OS).

    Citation Envoyé par tyrtamos Voir le message
    Bref, jusqu'à présent, je n'ai pas trouvé d'inconvénient à cette manière de travailler, à part qu'il ne faut pas se tromper de python selon ce qu'on veut faire.

    Vois-tu un problème auquel je n'aurais pas pensé?
    Ca me semble correct mais c'est laborieux et il y a tellement d'étapes que çà fait peur...
    In fine, çà revient à mettre à jour la registry via de multiples installations/desinstallations.
    Si tu préféreres y aller par ce sentier sinueux là, pourquoi pas?
    L'essentiel est d'arriver à construire un truc qui fonctionne et dans lequel on sera "confiant".

    Citation Envoyé par tyrtamos Voir le message
    Mais comme je n'aime pas trop bidouiller dans les fichiers de registres, j'ai essayé de trouver une manip qui ne le nécessite pas. Je reviendrai au code si je n'y arrive pas.
    Il y a pas mal de bibliothèques qui ont un installer qui se basent sur les informations présentes dans la registry. Et comme elles ne servent presque qu'à çà, difficile de faire autrement que de mettre à jour la registry. Mais ce n'est pas "bidouille" lorsqu'on sait ce qu'on fait (et le défaire).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Merci wiztricks!

    Je creuse un peu le code que tu me proposes pour bien comprendre ce qu'il fait.

    Quand on lance ce code (ce que je n'ai pas encore fait), il n'exécute, sauf en cas d'erreur, que la fonction RegisterPy, qui fait (j'y mets ce qui correspond à ma config):

    - ouvre l'item du registre: "HKEY_LOCAL_MACHINE\SOFTWARE\Python\Pythoncore\3.4\" (le crée s'il n'existe pas, ce qui est mon cas)

    - y ajoute la clé "InstallPath" avec la valeur "E:\Python34"

    - y ajoute la clé "PythonPath" avec la valeur "E:\Python34;E:\Python34\Lib\;E:\Python34\DLLs\"

    - et bien sûr, ferme l'item de registre ainsi modifiée.

    Mais je ne vois pas en quoi cet ajout peut résoudre mon problème PyQt4 / PyQt5: peux-tu m'en dire plus?

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 675
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 675
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Mais je ne vois pas en quoi cet ajout peut résoudre mon problème PyQt4 / PyQt5: peux-tu m'en dire plus?
    On crée le venv et on lance le code depuis ce Python là.
    Il devient le "Python 3.4".
    On installe les packages récalcitrants (dans le venv).

    Puis on peut remettre la registry dans l'état "initial" en exécutant le script avec le Python3.4 "normal".

    - W

    *edit* Oops, j'ai retrouvé mes notes. En fait, dans ce cas, c'est la plutôt clé PyQtX\PyV.n\InstallPath qui fout la grouille si l'installer y trouve ce qu'il cherche.
    Le hack est de la mettre à "vide" le temps d'installer l'autre PyQtX puis la remettre à sa valeur. En fait pour ce kit là, bricoler la registry pour qu'il trouve le Python 3.4 qu'on veut n'est pas indispensable: il fait partie des "bon kits" qui proposent de choisir le répertoire d'installation.
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 07/10/2009, 16h02
  2. Réponses: 1
    Dernier message: 03/10/2008, 09h57
  3. Réponses: 2
    Dernier message: 17/12/2007, 01h21
  4. [PyQt] Mon appli se fige avec les sockets
    Par neeux dans le forum PyQt
    Réponses: 3
    Dernier message: 08/01/2006, 21h57
  5. gérer le clic gauche-droite en même temps de la sou
    Par Guigui_ dans le forum Langage
    Réponses: 4
    Dernier message: 29/11/2002, 22h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo