[PYTHON] Définissez les variables d'environnement requises pour PySide (Qt4) et PyQt (Qt5)

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.

Environnement prérequis

Installation de Qt4 / Qt5

Installez via Homebrew.

Qt4/Installez Qt5(Homebrew)


$ brew install qt
$ brew install qt5

Installer PySide

Puisque PySide peut être installé via pip, installez-le sous virtualenv.

Installer PySide(pip)


$ mkvirtualenv -p python3 pyside
(pyside)$ mkvirtualenv 
(pyside)$ pip install PySide

Installez PyQt

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

Exécutez PySide

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

Exécutez PyQt

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

Changement de variables d'environnement

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

Définissez les variables d'environnement requises pour PySide (Qt4) et PyQt (Qt5)
[Python] Mesure et affiche le temps nécessaire au traitement
L'environnement de développement PySide / PyQt le plus puissant est également PyCharm
Sélectionnez les variables requises dans TensorFlow et enregistrez / restaurez
Recherchez le pandas.DataFrame avec une variable et obtenez la ligne correspondante.
Définir des variables d'environnement avec lambda-uploader
Créez un sélecteur de couleurs pour la roue chromatique avec Python + Qt (PySide)
Préparer l'environnement pour Atom pour Pythonista
J'ai défini des variables d'environnement dans Docker et je les ai affichées en Python.
Définissez la variable d'environnement PYTHONPATH sur zsh
Préparer l'environnement de développement pour keyhac pour Mac
[Note] Que faire si la bibliothèque Qt entre en conflit entre pyqt et opencv