Virtualenv: créer éventuellement un lien pythonw dans virtualenv pour le framework python construit sur osx

Créé le 14 mars 2011  ·  34Commentaires  ·  Source: pypa/virtualenv

http://groups.google.com/group/python-virtualenv/browse_thread/thread/83fa4a12d22a30c8/744e19c194f1618a?#744e19c194f1618a détaille comment wxpython pourrait être activé pour python sur OSX dans virtualenvs par analogie avec la façon dont il fonctionne actuellement pour win32 et python modes d'installation.

La discussion précédente d'Ian dans ce sens est ici :
http://groups.google.com/group/python-virtualenv/browse_thread/thread/b119a3c26aa49238
et le code qui le fait pour le moment est listé ici :
http://github.com/gldnspud/virtualenv-pythonw-osx/

Pouvons-nous intégrer cela dans la distribution principale ? Qu'est-ce qui devrait changer dans l'approche?


enhancement

Commentaire le plus utile

Essayez de changer le backend matplotlib pour que matplotlib fonctionne dans un environnement virtuel :

Il y a (au moins) deux solutions que j'ai utilisées, avec quelques méthodes supplémentaires incluses ci-dessous. Les deux décrits ici devraient correspondre à la même chose avec une approche légèrement différente :

Si vous avez déjà installé matplotlib en utilisant pip sur votre environnement virtuel, vous pouvez...

_1. Ajoutez un nouveau fichier matplotlibrc pour votre environnement virtuel_
Par exemple, dans votre environnement virtuel, exécutez :

$ cd ~/.matplotlib
$ nano matplotlibrc #to create file using nano

Écrivez backend: TkAgg dans le fichier et enregistrez à la sortie. Vous devriez être prêt à partir.

_OU _

_2. Modifiez le fichier matplotlibrc référencé par votre environnement virtuel_
Dans votre environnement virtuel, ouvrez un shell python et exécutez :

import matplotlib
matplotlib.matplotlib_fname()
'/home/foo/.config/matplotlib/matplotlibrc'

Remarque/Mise à jour : si vous obtenez une erreur de syntaxe dans votre environnement virtuel, vous devrez peut-être simplement exécuter :

import matplotlib
matplotlib.matplotlib_fname()

Cela affiche le fichier matplotlibrc référencé par le package matplotlib dans votre environnement virtuel. Suivez le chemin et ouvrez le fichier matplotlibrc. Modifiez la balise backend du fichier pour lire backend: TkAgg et save

[ Aussi - _Une troisième approche_]
Je n'ai pas essayé auparavant, mais selon la documentation, vous devriez pouvoir définir le backend lors de l'importation de matplotlib si vous ne voulez pas changer le backend dans le script lui-même :

import matplotlib
matplotlib.use('TkAgg')

(voir les sources ci-dessous pour plus d'explications et des méthodes supplémentaires)

Sources:
[1] http://matplotlib.org/faq/usage_faq.html#what -is-a-backend
[2] http://matplotlib.org/users/customizing.html#customizing-matplotlib
[3] http://stackoverflow.com/questions/4130355/python-matplotlib-framework-under-macosx
[4] http://stackoverflow.com/questions/29433824/unable-to-import-matplotlib-pyplot-as-plt-in-virtualenv

Tous les 34 commentaires

note, peut-être en double #47 , mais le problème y est un peu plus boueux.


Original Comment By: dan mackinlay

+1 à ce sujet.

Quel est le répertoire ".Python" qui veut lier dans
http://github.com/gldnspud/virtualenv-pythonw-osx/ ? Je ne vois aucun .Python mon venv.

A la place, je vois ceci :

 (py27) $ laf /Users/glind/venvs/py27//include/python2.7
 /Users/glind/venvs/py27//include/python2.7@ -> /usr/local/Cellar/python/2.7.2/include/python2.7
 (py27) $ which python
 /Users/glind/venvs/py27/bin/python

Ce bogue se manifeste de différentes manières :

http://stackoverflow.com/questions/3692928/why-doesnt-the-save-button-work-on-a-matplotlib-plot
http://code.google.com/p/iterm2/issues/detail?id=1680

La raison pour laquelle il n'y avait pas de .Python était parce que dans mon premier j'étais en train de venger d'un brew install python . Seules brew install python --framework et les autres installations de Framework obtiennent le .Python dynlib.

Un correctif pour cela en vue? J'ai toujours le problème avec les timides fenêtres Matplotlib

Ce problème date de 4,5 ans et nécessite de vilains hacks pour que matplotlib s'exécute sur Mac OSX . Pouvons-nous s'il vous plaît corriger cela?

Je seconde ceci. J'ai installé python 2.7 puis créé virtualenv à l'aide des commandes suivantes :

brew install python --framework
virtualenv env
source env/bin/activate
pip install matplotlib

Mais je reçois le message suivant lorsque j'essaie d'importer matplotlib.pyplot .

Python 2.7.10 (default, Aug 22 2015, 20:33:39)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.1)] on darwin
>>> import matplotlib.pyplot as plt
...
    from matplotlib.backends import _macosx
RuntimeError: Python is not installed as a framework. The Mac OS X backend will not be able to function correctly if Python is not installed as a framework. See the Python documentation for more information on installing Python as a framework on Mac OS X. Please either reinstall Python as a framework, or try one of the other backends. If you are Working with Matplotlib in a virtual enviroment see 'Working with Matplotlib in Virtual environments' in the Matplotlib FAQ

La solution de contournement mentionnée par @nils-werner fonctionne. Mais son énorme bloqueur pour les débutants qui veulent travailler avec matplotlib (pas seulement) dans jupyter notebook dans virtualenv.

J'ai écrit un guide détaillé sur la façon de contourner ce problème, http://blog.rousek.name/2015/11/29/adventure-with-matplotlib-virtualenv-and-macosx/

Ugh ........ Je viens de le frapper aussi, suite à une mise à niveau vers matplotlib 1.5 (qui ne parvient plus à importer un backend, comme documenté ci-dessus par @stlk). J'utilise un python installé 3.5.

Je passais par une introduction à la visualisation à l'aide du chapitre python, et je ne peux même pas commencer à écrire le premier échantillon de code dans jupyter car je continue à rencontrer ce problème sur un mac... J'utilise le système python fourni avec mac + virtualenv .

+1

+1
Oh mon Dieu....
problème de 2011.. toujours pas résolu .

En attendant, l'utilitaire lié dans ce numéro (et sur la FAQ) fonctionnait toujours pour moi :

$ # install the utility
$ pip install git+https://github.com/gldnspud/virtualenv-pythonw-osx.git
$ # enter the virtualenv with virtualenvwrapper (or manually)
$ workon my-venv
$ # double-check that this is your venv Python binary
$ which python
/Users/macbook/.virtualenvs/my-venv/bin/python
$ # fix it, using magic
$ fix-osx-virtualenv `which python`/../..

Oui, c'est assez simple, mais j'ai mis du temps à comprendre. Je n'ai aucune idée de ce que cela fait, mais par conséquent, Matplotlib fonctionne simplement en l'invoquant à l'aide de ce binaire Python venv - pas besoin d'une fonction shell wrapper.

Je connais cette solution mais :

  • Vous devez le répéter (et vous rappeler comment le faire) pour tous vos virtualenvs
  • Cela rend impossible la construction de certains modules externes ou lors de l'utilisation de CFFI ou autre (il faudra aller vérifier ce que c'était exactement)

Cela ne semble pas être une solution idéale, mais une solution de contournement simple consiste à utiliser virtualenvwrapper , puis à utiliser les crochets pour configurer les choses. Installez virtualenv-pythonw-osx et virtualevnwrapper, sourcez le fichier virtualenvwrapper.sh afin de créer les scripts hook, puis ajoutez ce qui suit au script postactivate :

if [ ! -d $VIRTUAL_ENV/Python.app ]; then
  echo Fixing OSX Python display issues...
  fix-osx-virtualenv $VIRTUAL_ENV
fi

Cela corrigera automatiquement tout environnement virtuel lorsque vous l'activerez via la commande workon

+1

+1

+1

Frappez juste ce bug, aussi. La solution de contournement suggérée n'est pas exactement élégante. Ce serait bien d'être réparé !

Essayez de changer le backend matplotlib pour que matplotlib fonctionne dans un environnement virtuel :

Il y a (au moins) deux solutions que j'ai utilisées, avec quelques méthodes supplémentaires incluses ci-dessous. Les deux décrits ici devraient correspondre à la même chose avec une approche légèrement différente :

Si vous avez déjà installé matplotlib en utilisant pip sur votre environnement virtuel, vous pouvez...

_1. Ajoutez un nouveau fichier matplotlibrc pour votre environnement virtuel_
Par exemple, dans votre environnement virtuel, exécutez :

$ cd ~/.matplotlib
$ nano matplotlibrc #to create file using nano

Écrivez backend: TkAgg dans le fichier et enregistrez à la sortie. Vous devriez être prêt à partir.

_OU _

_2. Modifiez le fichier matplotlibrc référencé par votre environnement virtuel_
Dans votre environnement virtuel, ouvrez un shell python et exécutez :

import matplotlib
matplotlib.matplotlib_fname()
'/home/foo/.config/matplotlib/matplotlibrc'

Remarque/Mise à jour : si vous obtenez une erreur de syntaxe dans votre environnement virtuel, vous devrez peut-être simplement exécuter :

import matplotlib
matplotlib.matplotlib_fname()

Cela affiche le fichier matplotlibrc référencé par le package matplotlib dans votre environnement virtuel. Suivez le chemin et ouvrez le fichier matplotlibrc. Modifiez la balise backend du fichier pour lire backend: TkAgg et save

[ Aussi - _Une troisième approche_]
Je n'ai pas essayé auparavant, mais selon la documentation, vous devriez pouvoir définir le backend lors de l'importation de matplotlib si vous ne voulez pas changer le backend dans le script lui-même :

import matplotlib
matplotlib.use('TkAgg')

(voir les sources ci-dessous pour plus d'explications et des méthodes supplémentaires)

Sources:
[1] http://matplotlib.org/faq/usage_faq.html#what -is-a-backend
[2] http://matplotlib.org/users/customizing.html#customizing-matplotlib
[3] http://stackoverflow.com/questions/4130355/python-matplotlib-framework-under-macosx
[4] http://stackoverflow.com/questions/29433824/unable-to-import-matplotlib-pyplot-as-plt-in-virtualenv

@wwp3 Super article, merci ! J'ai eu de la chance avec cette option:

import matplotlib
matplotlib.use('TkAgg')

Travailler sur l'amélioration de la documentation Matplotlib pour ce problème @stlk toute objection à l'utilisation d'une partie de votre guide pour le correctif du problème du bloc-notes Jupyter (nous avons déjà couvert le terminal python/ipython)

@jenshnielsen N'hésitez pas à l'utiliser, je suis heureux que cela soit utile.

+1

Est-ce que c'est résolu ? Si oui, quelqu'un peut-il clore le problème ?

Ce n'est pas

Absolument pas. C'est pire que jamais car il plante sur import . Étapes à reproduire

virtualenv test
source test/bin/activate
pip install matplotlib
python -c "import matplotlib.pyplot; print 'import succeeded'"

Y a-t-il un PR qui corrige cela? Si oui, les personnes rencontrant le problème l'ont-elles testé et ont-elles confirmé qu'elle résout le problème ? S'il n'y en a pas, est-ce que quelqu'un travaille dessus ? Il sera plus ou moins impossible pour quiconque ne peut pas reproduire le problème (ce qui nécessite, je suppose, une installation d'OSX au minimum pour le faire) de développer un correctif, nous comptons donc sur les contributions ici.

@nils-werner merci pour la description claire de la façon de reproduire. Si vous pouviez ajouter des détails sur l'environnement (tout ce que je vois dans le fil est "OSX", mais rien de spécifique pour savoir s'il s'agit de toutes les versions, quelle version de virtualenv et de python et comment ils ont été installés, si certaines autres choses doivent être installées, comment les installer, etc.) qui serait également utile.

Ensuite, j'espère que quelqu'un ayant accès à un environnement approprié pourra produire un PR et le référencer ici. À ce stade, nous pouvons examiner le PR et partir de là.

@pfmoore J'ai utilisé la solution de contournement dans mon commentaire précédent , qui fonctionne toujours pour moi. – Bien que je ne sois pas sûr du _comment_ cela fonctionne. Voir aussi le commentaire suivant de @nils-werner.

(Pour mémoire : OS X 10.11.6, Python 3.5.2, matplotlib-1.5.3.)

@nils-werner La seule raison pour laquelle c'est pire, c'est que nous vérifions explicitement la construction d'un framework avant d'exécuter le backend OSX dans Matplotlib https://github.com/matplotlib/matplotlib/blob/master/src/_macosx.m#L3071

L'alternative est une défaillance logicielle où l'interface graphique n'est que partiellement fonctionnelle.

WXPython a une version de vérification similaire qui vous empêche d'utiliser WXPython à partir d'une version non-framework.

La meilleure solution consiste à utiliser venv de la bibliothèque standard si vous utilisez python3
Contrairement à virtualenv qui fonctionne correctement.
http://matplotlib.org/devdocs/faq/osx_framework.html#introduction

OK, donc je suppose que si personne ne travaille sur un PR, la résolution ici est soit :

  1. Si vous êtes sur Python 3, utilisez stdlib venv
  2. Sinon, utilisez la solution de contournement indiquée.

Frais. Je ne sais pas si cela vaut la peine de laisser le problème ouvert dans ce cas - il existe une solution de contournement claire, et toute correction de code serait de toute façon un nouveau PR. Je suggère que nous fermions le sujet - des commentaires ?

Des mises à jour à ce sujet ? Ce serait bien de régler ce problème au lieu d'avoir à utiliser des solutions de contournement.

@wwp3 Super, merci ! Je l'ai corrigé avec succès avec cette option:

  1. Ajouter un nouveau fichier matplotlibrc pour votre environnement virtuel
    Par exemple, dans votre environnement virtuel, exécutez :

$ cd ~/.matplotlib
$ nano matplotlibrc #pour créer un fichier avec nano
Écrivez le backend : TkAgg dans le fichier et enregistrez-le en quittant. Vous devriez être prêt à partir.

@stlk qui a été utile merci

Ce problème a été automatiquement marqué comme obsolète car il n'a pas eu d'activité récente. Il sera fermé si aucune autre activité ne se produit. Ajoutez simplement un commentaire si vous voulez le garder ouvert. Merci pour vos contributions.

Essayez de changer le backend matplotlib pour que matplotlib fonctionne dans un environnement virtuel :

Il y a (au moins) deux solutions que j'ai utilisées, avec quelques méthodes supplémentaires incluses ci-dessous. Les deux décrits ici devraient correspondre à la même chose avec une approche légèrement différente :

Si vous avez déjà installé matplotlib en utilisant pip sur votre environnement virtuel, vous pouvez...

_1. Ajoutez un nouveau fichier matplotlibrc pour votre environnement virtuel_
Par exemple, dans votre environnement virtuel, exécutez :

$ cd ~/.matplotlib
$ nano matplotlibrc #to create file using nano

Écrivez backend: TkAgg dans le fichier et enregistrez à la sortie. Vous devriez être prêt à partir.

_ _OU __

_2. Modifiez le fichier matplotlibrc référencé par votre environnement virtuel_
Dans votre environnement virtuel, ouvrez un shell python et exécutez :

import matplotlib
matplotlib.matplotlib_fname()
'/home/foo/.config/matplotlib/matplotlibrc'

Remarque/Mise à jour : si vous obtenez une erreur de syntaxe dans votre environnement virtuel, vous devrez peut-être simplement exécuter :

import matplotlib
matplotlib.matplotlib_fname()

Cela affiche le fichier matplotlibrc référencé par le package matplotlib dans votre environnement virtuel. Suivez le chemin et ouvrez le fichier matplotlibrc. Modifiez la balise backend du fichier pour lire backend: TkAgg et save

[ Aussi - _Une troisième approche_]
Je n'ai pas essayé auparavant, mais selon la documentation, vous devriez pouvoir définir le backend lors de l'importation de matplotlib si vous ne voulez pas changer le backend dans le script lui-même :

import matplotlib
matplotlib.use('TkAgg')

(voir les sources ci-dessous pour plus d'explications et des méthodes supplémentaires)

Sources:
[1] http://matplotlib.org/faq/usage_faq.html#what -is-a-backend
[2] http://matplotlib.org/users/customizing.html#customizing-matplotlib
[3] http://stackoverflow.com/questions/4130355/python-matplotlib-framework-under-macosx
[4] http://stackoverflow.com/questions/29433824/unable-to-import-matplotlib-pyplot-as-plt-in-virtualenv

Votre première solution est tellement géniale et a résolu mon problème. THX!

Cette page vous a été utile?
0 / 5 - 0 notes