Virtualenv: opcionalmente, crie um link pythonw em virtualenv para compilações de framework python em osx

Criado em 14 mar. 2011  ·  34Comentários  ·  Fonte: pypa/virtualenv

http://groups.google.com/group/python-virtualenv/browse_thread/thread/83fa4a12d22a30c8/744e19c194f1618a?#744e19c194f1618a detalha como wxpython pode ser habilitado para python no OSX em virtualenvs por analogia com a forma como funciona atualmente para win32 e cygwin modos de instalação.

A discussão anterior de Ian ao longo dessas linhas está aqui:
http://groups.google.com/group/python-virtualenv/browse_thread/thread/b119a3c26aa49238
e o código que faz isso no momento está listado aqui:
http://github.com/gldnspud/virtualenv-pythonw-osx/

Podemos colocar isso na distribuição central? O que precisaria mudar na abordagem?


enhancement

Comentários muito úteis

Tente alterar o back-end matplotlib para fazer o matplotlib funcionar em um ambiente virtual:

Existem (pelo menos) duas soluções que usei, com alguns métodos adicionais incluídos abaixo. Ambos descritos aqui devem ser a mesma coisa com uma abordagem ligeiramente diferente:

Se você já instalou matplotlib usando pip em seu ambiente virtual, você pode ...

_1. Adicione um novo arquivo matplotlibrc para o seu ambiente virtual_
Por exemplo, em seu ambiente virtual, execute:

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

Escreva backend: TkAgg no arquivo e salve ao sair. Você deve estar pronto para ir.

_OU _

_2. Edite o arquivo matplotlibrc referenciado por seu ambiente virtual_
Em seu ambiente virtual, abra um shell Python e execute:

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

Observação / atualização: se você receber um erro de sintaxe em seu ambiente virtual, pode ser necessário simplesmente executar:

import matplotlib
matplotlib.matplotlib_fname()

Isso exibe o arquivo matplotlibrc referenciado pelo pacote matplotlib em seu ambiente virtual. Siga o caminho e abra o arquivo matplotlibrc. Edite a tag backend do arquivo para ler backend: TkAgg e save

[ Além disso - _Uma terceira abordagem_]
Não tentei antes, mas de acordo com a documentação, você deve ser capaz de definir o back-end na importação de matplotlib se não quiser alterar o back-end no próprio script:

import matplotlib
matplotlib.use('TkAgg')

(veja as fontes abaixo para mais explicações e métodos adicionais)

Fontes:
[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

Todos 34 comentários

note, possivelmente duplica o nº 47 , mas o problema ali é um pouco mais confuso.


Original Comment By: dan mackinlay

+1 sobre isso.

Qual é o diretório ".Python" que deseja vincular em
http://github.com/gldnspud/virtualenv-pythonw-osx/ ? Não vejo nenhum .Python meu venv.

Em vez disso, vejo isto:

 (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

Este bug se manifesta de várias maneiras:

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

A razão de não haver .Python foi porque na minha inicial eu estava saindo de um brew install python . Apenas brew install python --framework e outras instalações do Framework obtêm o .Python dynlib.

Uma correção para isso em vista? Ainda tenho o problema das janelas tímidas do Matplotlib

Este problema tem 4,5 anos e requer hacks feios para fazer matplotlib rodar no Mac OSX . Podemos consertar isso?

Eu apoio isso. Instalei o python 2.7 e criei o virtualenv usando os seguintes comandos:

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

Mas recebo a seguinte mensagem quando tento importar 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

A solução alternativa mencionada por @ nils-werner funciona. Mas é um grande bloqueador para iniciantes que querem trabalhar com matplotlib (não só) no notebook jupyter no virtualenv.

Escrevi um guia detalhado de como contornar esse problema, http://blog.rousek.name/2015/11/29/adventure-with-matplotlib-virtualenv-and-macosx/

Ugh ....... Acabei de bater nisso também, após uma atualização para matplotlib 1.5 (que agora falha ao importar um back-end, conforme documentado acima por @stlk). Estou usando um brew instalado python 3.5.

Estava passando por uma introdução ao capítulo de visualização usando python, e não consigo nem começar a escrever a primeira amostra de código no jupyter porque continuo encontrando esse problema em um mac ... Estou usando o sistema python que vem com mac + virtualenv .

+1

+1
Oh Deus....
problema de 2011 .. ainda não corrigido .

Enquanto isso, o utilitário vinculado a este problema (e no FAQ) ainda funcionou para mim:

$ # 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`/../..

Sim, é bastante simples, mas demorei um pouco para descobrir. Não tenho ideia do que isso faz, mas como resultado Matplotlib funciona simplesmente invocando-o usando aquele binário Python venv - não há necessidade de uma função de shell de invólucro.

Eu conheço esta solução, mas:

  • Você precisa repetir (e lembrar como fazer) para todos os seus ambientes virtuais
  • Isso torna impossível construir certos módulos externos ou ao usar CFFI ou algo assim (será necessário verificar o que era exatamente)

Não parece uma solução ideal, mas uma solução fácil é usar o virtualenvwrapper e, em seguida, usar os ganchos para configurar as coisas. Instale virtualenv-pythonw-osx e virtualevnwrapper, crie o arquivo virtualenvwrapper.sh para criar os scripts de gancho e adicione o seguinte ao script postactivate :

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

Isso corrigirá automaticamente qualquer ambiente virtual quando você ativá-los por meio do comando workon

+1

+1

+1

Basta acertar este bug também. A solução alternativa sugerida não é exatamente elegante. Seria ótimo consertar!

Tente alterar o back-end matplotlib para fazer o matplotlib funcionar em um ambiente virtual:

Existem (pelo menos) duas soluções que usei, com alguns métodos adicionais incluídos abaixo. Ambos descritos aqui devem ser a mesma coisa com uma abordagem ligeiramente diferente:

Se você já instalou matplotlib usando pip em seu ambiente virtual, você pode ...

_1. Adicione um novo arquivo matplotlibrc para o seu ambiente virtual_
Por exemplo, em seu ambiente virtual, execute:

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

Escreva backend: TkAgg no arquivo e salve ao sair. Você deve estar pronto para ir.

_OU _

_2. Edite o arquivo matplotlibrc referenciado por seu ambiente virtual_
Em seu ambiente virtual, abra um shell Python e execute:

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

Observação / atualização: se você receber um erro de sintaxe em seu ambiente virtual, pode ser necessário simplesmente executar:

import matplotlib
matplotlib.matplotlib_fname()

Isso exibe o arquivo matplotlibrc referenciado pelo pacote matplotlib em seu ambiente virtual. Siga o caminho e abra o arquivo matplotlibrc. Edite a tag backend do arquivo para ler backend: TkAgg e save

[ Além disso - _Uma terceira abordagem_]
Não tentei antes, mas de acordo com a documentação, você deve ser capaz de definir o back-end na importação de matplotlib se não quiser alterar o back-end no próprio script:

import matplotlib
matplotlib.use('TkAgg')

(veja as fontes abaixo para mais explicações e métodos adicionais)

Fontes:
[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 Ótimo artigo, obrigado! Tive sorte com esta opção:

import matplotlib
matplotlib.use('TkAgg')

Trabalhando para melhorar a documentação do Matplotlib para este problema @stlk quaisquer objeções ao uso de parte do seu guia para a correção do problema do notebook Jupyter (já temos o terminal python / ipython coberto)

@jenshnielsen Sinta-se à vontade para usá-lo, fico feliz que seja útil.

+1

Isso está resolvido? Em caso afirmativo, alguém pode encerrar o problema?

Não é

Absolutamente não. Está pior do que nunca, pois trava em import . Passos para reproduzir

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

Existe um PR que corrige isso? Em caso afirmativo, as pessoas que encontraram o problema o testaram e confirmaram que ele resolve o problema? Se não houver, alguém está trabalhando em um? Vai ser mais ou menos impossível para quem não consegue reproduzir o problema (que precisa, eu acho, de uma instalação do OSX no mínimo para fazer) desenvolver uma correção, então estamos contando com contribuições aqui.

@ nils-werner obrigado pela descrição clara de como reproduzir. Se você pudesse adicionar detalhes do ambiente (tudo que vejo no tópico é "OSX", mas nada específico sobre se são todas as versões, qual versão do virtualenv e python e como eles foram instalados, se certas outras coisas precisam ser instaladas, como instale-os etc.) que também seria útil.

Então, esperançosamente, alguém com acesso a um ambiente adequado pode produzir um PR e referenciá-lo aqui. Nesse estágio, podemos revisar o PR e continuar a partir daí.

@pfmoore Tenho usado a solução alternativa em meu comentário anterior , que ainda funciona para mim de forma consistente. - Embora eu não tenha certeza _como_ isso funciona. Veja também o seguinte comentário de @ nils-werner.

(Para registro: OS X 10.11.6, Python 3.5.2, matplotlib-1.5.3.)

@ nils-werner O único motivo pelo qual é pior é que verificamos explicitamente se há uma construção de estrutura antes de executar o backend OSX no Matplotlib https://github.com/matplotlib/matplotlib/blob/master/src/_macosx.m#L3071

A alternativa é uma falha leve em que a interface do usuário é apenas parcialmente funcional.

O WXPython tem uma compilação de verificação semelhante que o impede de usar o WXPython a partir de uma compilação sem estrutura.

A melhor solução é usar o venv da biblioteca padrão se você estiver usando o python3
Ao contrário do virtualenv, que funciona corretamente.
http://matplotlib.org/devdocs/faq/osx_framework.html#introduction

OK, então acho que se ninguém está trabalhando em um PR, a resolução aqui é:

  1. Se você estiver no Python 3, use stdlib venv
  2. Caso contrário, use a solução alternativa observada.

Legal. Não tenho certeza se vale a pena deixar o problema em aberto nesse caso - há uma solução alternativa clara e qualquer correção de código seria um novo PR de qualquer maneira. Sugiro que encerremos o problema - comentários?

Alguma atualização sobre isso? Seria bom ter isso corrigido em vez de ter que usar soluções alternativas.

@ wwp3 Ótimo, obrigado! Consertei com sucesso com esta opção:

  1. Adicione um novo arquivo matplotlibrc para o seu ambiente virtual
    Por exemplo, em seu ambiente virtual, execute:

$ cd ~ / .matplotlib
$ nano matplotlibrc #para criar um arquivo usando o nano
Escreva backend: TkAgg no arquivo e salve ao sair. Você deve estar pronto para ir.

@stlk isso foi útil, obrigado

Este problema foi marcado automaticamente como obsoleto porque não teve atividades recentes. Ele será fechado se nenhuma outra atividade ocorrer. Basta adicionar um comentário se quiser mantê-lo aberto. Obrigado por suas contribuições.

Tente alterar o back-end matplotlib para fazer o matplotlib funcionar em um ambiente virtual:

Existem (pelo menos) duas soluções que usei, com alguns métodos adicionais incluídos abaixo. Ambos descritos aqui devem ser a mesma coisa com uma abordagem ligeiramente diferente:

Se você já instalou matplotlib usando pip em seu ambiente virtual, você pode ...

_1. Adicione um novo arquivo matplotlibrc para o seu ambiente virtual_
Por exemplo, em seu ambiente virtual, execute:

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

Escreva backend: TkAgg no arquivo e salve ao sair. Você deve estar pronto para ir.

_ _OR __

_2. Edite o arquivo matplotlibrc referenciado por seu ambiente virtual_
Em seu ambiente virtual, abra um shell Python e execute:

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

Observação / atualização: se você receber um erro de sintaxe em seu ambiente virtual, pode ser necessário simplesmente executar:

import matplotlib
matplotlib.matplotlib_fname()

Isso exibe o arquivo matplotlibrc referenciado pelo pacote matplotlib em seu ambiente virtual. Siga o caminho e abra o arquivo matplotlibrc. Edite a tag backend do arquivo para ler backend: TkAgg e save

[ Além disso - _Uma terceira abordagem_]
Não tentei antes, mas de acordo com a documentação, você deve ser capaz de definir o back-end na importação de matplotlib se não quiser alterar o back-end no próprio script:

import matplotlib
matplotlib.use('TkAgg')

(veja as fontes abaixo para mais explicações e métodos adicionais)

Fontes:
[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

Sua primeira solução é ótima e resolveu meu problema. Valeu!

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

earthgecko picture earthgecko  ·  4Comentários

abn picture abn  ·  4Comentários

oconnor663 picture oconnor663  ·  3Comentários

zbuc picture zbuc  ·  5Comentários

jwarren116 picture jwarren116  ·  5Comentários