Lors de la réalisation de Qt4 / Qt5 et PySide (compatible Qt4, compatible Qt5) / PyQt (compatible Qt5), une certaine ingéniosité était nécessaire autour des variables d'environnement.
Installez via Homebrew.
Qt4/Installez Qt5(Homebrew)
$ brew install qt
$ brew install qt5
Puisque PySide peut être installé via pip, installez-le sous virtualenv.
Installer PySide(pip)
$ mkvirtualenv -p python3 pyside
(pyside)$ mkvirtualenv
(pyside)$ pip install PySide
J'ai également essayé d'installer PyQt via pip, mais je n'ai pas pu l'installer car il était déjà supprimé.
Installez PyQt(Échec avec pip)
$ mkvirtualenv -p python3 pyqt
(pyqt)$ pip install PyQt5
Downloading/unpacking PyQt5
Could not find any downloads that satisfy the requirement PyQt5
Cleaning up...
No distributions at all found for PyQt5
Storing debug log for failure in /Users/FGtatsuro/.pip/pip.log
Par conséquent, j'ai décidé d'installer PyQt via Homebrew. Pour les problèmes lors de l'installation, voir ici. PyQt lui-même a été installé via Homebrew, mais en envisageant d'installer des bibliothèques associées, créez un environnement virtualenv comme PySide.
Installez PyQt(Homebrew)
(pyqt)$ brew install pyqt5
J'ai essayé d'exécuter l'exemple PySide à ici, mais il n'a pas réussi à charger la bibliothèque dynamique et n'a pas pu être exécuté.
Exécutez PySide(Échec)
(pyside)$ python pyside_test.py
Traceback (most recent call last):
File "pyside_test.py", line 6, in <module>
from PySide.QtCore import *
ImportError: dlopen(/Users/FGtatsuro/.homesick/repos/dotfiles/home/.virtualenvs/pyside/lib/python3.4/site-packages/PySide/QtCore.so, 2): Library not loaded: libpyside.cpython-34m.1.2.dylib
Referenced from: /Users/FGtatsuro/.homesick/repos/dotfiles/home/.virtualenvs/pyside/lib/python3.4/site-packages/PySide/QtCore.so
Reason: image not found
La bibliothèque dynamique que vous essayez de charger se trouve sous site-package dans virtualenv. Il peut être exécuté en ajoutant le chemin à la variable d'environnement DYLD_LIBRARY_PATH
.
Exécutez PySide(Succès)
(pyside)$ ls /Users/FGtatsuro/.homesick/repos/dotfiles/home/.virtualenvs/pyside/lib/python3.4/site-packages/PySide/libpyside.cpython-34m.1.2.dylib
/Users/FGtatsuro/.homesick/repos/dotfiles/home/.virtualenvs/pyside/lib/python3.4/site-packages/PySide/libpyside.cpython-34m.1.2.dylib
(pyside)$ export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:/Users/FGtatsuro/.homesick/repos/dotfiles/home/.virtualenvs/pyside/lib/python3.4/site-packages/PySide
(pyside)$ python pyside_test.py
J'ai essayé d'exécuter l'exemple PyQt à ici, mais il ne parvient pas à charger le module PyQt.
Exécutez PyQt(Échec)
(pyqt)$ python pyqt_test.py
Traceback (most recent call last):
File "pyqt_test.py", line 4, in <module>
from PyQt5.QtCore import *
ImportError: No module named 'PyQt5'
La cause est que le package de site de PyQt (sip dont dépend + PyQt) installé via Homebrew n'est pas visible depuis l'environnement virtualenv. Il peut être exécuté en ajoutant le chemin à la variable d'environnement PYTHONPATH
.
Exécutez PyQt(Succès)
(pyqt)$ export PYTHONPATH=$PYTHONPATH:/usr/local/opt/pyqt5/lib/python3.4/site-packages:/usr/local/opt/sip/lib/python3.4/site-packages
(pyqt)$ python pyqt_test.py
Jusqu'à présent, PySide / PyQt a été exécuté, mais il y a encore des problèmes lorsque ceux-ci coexistent. Si les deux DYLD_LIBRARY_PATH
requis pour PySide et PYTHONPATH
requis pour exécuter PyQt existent, l'exécution de PyQt échoue. (Problème de chargement de la bibliothèque?)
Échec de l'exécution de PyQt en raison d'une variable d'environnement
(pyqt)$ env | egrep 'DYLD_LIBRARY_PATH|PYTHONPATH'
DYLD_LIBRARY_PATH=/Users/FGtatsuro/.homesick/repos/dotfiles/home/.virtualenvs/pyside/lib/python3.4/site-packages/PySide
PYTHONPATH=/usr/local/opt/pyqt5/lib/python3.4/site-packages:/usr/local/opt/sip/lib/python3.4/site-packages
(pyqt)$ python pyqt_test.py
Traceback (most recent call last):
File "pyqt_test.py", line 5, in <module>
from PyQt5.QtWidgets import *
RuntimeError: the PyQt5.QtCore module failed to register with the sip module
Il peut être exécuté en désactivant DYLD_LIBRARY_PATH
, mais il est très ennuyeux d'avoir à connaître cette variable à chaque fois que l'environnement virtualenv est commuté.
Par conséquent, j'ai changé le fichier de configuration de virtualenvwrapper afin que les variables d'environnement requises lors de l'activation / désactivation de l'environnement virtualenv de PySide / PyQt soient exportées / annulées. «.virtualenvs / postactivate» est exécuté «après» activer, et «.virtualenvs / predeactivte» est exécuté «avant» de désactiver. Le jugement de l'environnement PySide dépend du pip "sous l'environnement virtualenv", et le moment du jugement doit être "après" être entré dans l'environnement virtualenv et "avant" de quitter l'environnement virtualenv.
Les conditions du jugement sont les suivantes.
--PySide: PySide est installé avec pip.
--PyQt: Le nom de l'environnement virtualenv contient la chaîne pyqt
.
.virtualenvs/postactivate
#!/bin/bash
# This hook is run after every virtualenv is activated.
#DYLD si PySide est installé avec pip_LIBRARY_Ajoutez le chemin requis à votre PATH.
if [ `pip freeze | grep PySide` ]; then
# Now, I can use PySide on only 3.4.x environment
VENV_PYSIDE_PATH=$VIRTUAL_ENV/lib/python3.4/site-packages/PySide
if [ $DYLD_LIBRARY_PATH ]; then
export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:$VENV_PYSIDE_PATH
else
export DYLD_LIBRARY_PATH=$VENV_PYSIDE_PATH
fi
fi
#Le nom de l'environnement virtualenv est"pyqt"S'il contient, ajoutez le chemin requis vers PYTHONPATH.
if [ `basename $VIRTUAL_ENV | grep pyqt` ]; then
# Now, I can use PyQt on only 3.4.x environment
BREW_PYQT_PATH=`brew --prefix pyqt5`/lib/python3.4/site-packages:`brew --prefix sip`/lib/python3.4/site-packages
if [ $PYTHONPATH ]; then
export PYTHONPATH=$PYTHONPATH:$BREW_PYQT_PATH
else
export PYTHONPATH=$BREW_PYQT_PATH
fi
fi
.virtualenvs/predeactivate
#!/bin/bash
# This hook is run before every virtualenv is deactivated.
#DYLD si PySide est installé avec pip_LIBRARY_Supprimez le chemin approprié du PATH.
if [ `pip freeze | grep PySide` ]; then
# Now, I can use PySide on only 3.4.x environment
VENV_PYSIDE_PATH=$VIRTUAL_ENV/lib/python3.4/site-packages/PySide
export DYLD_LIBRARY_PATH=`echo $DYLD_LIBRARY_PATH | sed -e "s|:*$VENV_PYSIDE_PATH||g"`
if [ -z $DYLD_LIBRARY_PATH ]; then
unset DYLD_LIBRARY_PATH
fi
fi
#Le nom de l'environnement virtualenv est"pyqt"Si, excluez le chemin approprié de PYTHONPATH.
if [ `basename $VIRTUAL_ENV | grep pyqt` ]; then
# Now, I can use PyQt on only 3.4.x environment
BREW_PYQT_PATH=`brew --prefix pyqt5`/lib/python3.4/site-packages:`brew --prefix sip`/lib/python3.4/site-packages
export PYTHONPATH=`echo $PYTHONPATH | sed -e "s|:*$BREW_PYQT_PATH||g"`
if [ -z $PYTHONPATH ];then
unset PYTHONPATH
fi
fi
Puisque PyQt ne pouvait pas être installé via pip, nous avons dû nous fier à la convention de dénomination de l'environnement virtualenv pour les conditions de jugement. Je suis un peu déçu, alors je vais réfléchir à une bonne idée.
Recommended Posts