Posso instalar pacotes do Windows Python em virtualenvs?

125

O Virtualenv é ótimo: permite-me manter várias instalações distintas do Python para que as dependências dos diferentes projetos não sejam todas reunidas em uma pilha comum.

Mas se eu quiser instalar um pacote no Windows empacotado como instalador .exe, como posso direcioná-lo para a instalação no virtualenv? Por exemplo, tenho pycuda-0.94rc.win32-py2.6.exe. Quando o executo, ele examina o registro e encontra apenas um Python26 para instalar, o comum no qual meu virtualenv se baseia.

Como posso direcioná-lo para a instalação no virtualenv?

Ned Batchelder
fonte
1
a resposta abaixo funciona para mim stackoverflow.com/questions/6114115/…
user1960422

Respostas:

201

Sim você pode. Tudo o que você precisa é

easy_install binary_installer_built_with_distutils.exe

Surpreso? Parece que os instaladores binários para Windows feitos com distutils combinam .exe com .zip em um arquivo .exe. Altere a extensão para .zip para ver se é um arquivo zip válido. Descobri isso depois de ler as respostas da minha pergunta. Onde posso baixar os ovos binários com o psycopg2 para Windows?

ATUALIZAR

Como observado por Tritium21 em sua resposta hoje em dia, você deve usar pip em vez de easy_install. O Pip não pode instalar pacotes binários criados pelo distutils, mas pode instalar pacotes binários no novo formato de roda . Você pode converter do formato antigo para o novo usando o pacote wheel , que você deve instalar primeiro.

Piotr Dobrogost
fonte
2
Eu concordo, isso é ótimo. A propósito, se você tiver o 7zip, poderá abrir o arquivo .exe diretamente, sem precisar renomeá-lo como zip.
Sabuncu
5
apenas uma dica: os desenvolvedores podem baixar vários pacotes python construídos para Windows em lfd.uci.edu/~gohlke/pythonlibs .
yangzh
@CodyHatch Você pode como esta não é minha única resposta em SO e há uma chance de algumas das minhas outras respostas seria útil para você também :)
Piotr Dobrogost
1
Eu recebo o seguinte: Procurando por binary-installer-built-with-distutils.exe Lendo pypi.python.org/simple/… Lendo pypi.python.org/simple/… Não foi possível encontrar a página de índice para 'binary_installer_built_with_distutils.exe' Índice de verificação de todos os pacotes (isso pode demorar um pouco) Lendo pypi.python.org/simple Não foram encontrados pacotes locais ou links de download para o erro binary-installer-built-with-distutils.exe: ( 'binary-instal ler embutido-com-d ...
Paul
1
Paul, o exe que ele está se referindo será diferente dependendo de qual instalador que você está usando ... não literalmente "binary-installer-built-com-distutils.exe"
Tristan Reid
70

Sei que essa é uma pergunta bastante antiga e antecede as ferramentas sobre as quais estou prestes a falar, mas, pelo bem do Google, acho uma boa idéia mencioná-la. easy_install é a ovelha negra do empacotamento python. Ninguém quer admitir usá-lo com a nova gostosura de pip ao redor. Além disso, enquanto executar truques de registro funcionará melhor para instaladores EXE não padrão (alguém construiu o instalador por conta própria, em vez de usar distutils, e está verificando o registro quanto ao caminho da instalação), agora existe uma maneira melhor (c) para instaladores EXE padrão .

pip install wheel
wheel convert INSTALLER.EXE
pip install NEW_FILE_CREATED_IN_LAST_STEP.whl

O formato da roda, introduzido recentemente a partir deste post, é o substituto do formato do ovo, desempenhando praticamente o mesmo papel. Este formato também é suportado pelo pip (uma ferramenta já instalada no seu virtualenv).

se por algum motivo pip install WHEELFILEnão funcionar, tentewheel install WHEELFILE

Tritium21
fonte
Obrigado por isso. Espero que mais pessoas notem sua resposta e votem!
Brett Stottlemyer
Para ser claro. Você pode criar um .whl a partir de .exe, por exemplo, a partir de lfd.uci.edu/~gohlke/pythonlibs , com isso. Este é enorme im termos de implantação!
Jonas Gröger #
Eu tentei fazer isso, mas recebi uma roda de erro converter numpy-MKL-1.8.1.win-amd64-py2.7.exe e depois instala o pip numpy-1.8.1-cp27-none-win_amd64.whl, recebo o seguinte erro Baixando / descompactando numpy-1.8.1-cp27-none-win-amd64.whl Não foi possível encontrar nenhum download que atenda ao requisito numpy-1.8.1-cp27-non e-win-amd64.whl Nenhuma distribuição encontrada para numpy -1.8.1-CP27-nenhum-win-amd64.whl
Paul
tente wheel install WHEELFILE, responda editado para apontar a existência disso. Depurar um problema específico para alguém não é algo trivial nos comentários do SO.
precisa saber é o seguinte
Depois de precisar do easy_install tantas vezes apenas para esse fim, ficou lindo. * ondas entre lágrimas adeus ao easy_install
KobeJohn
40

Acabei adaptando um script ( http://effbot.org/zone/python-register.htm ) para registrar uma instalação do Python no registro. Posso escolher o Python como o Python no registro, executar o instalador do Windows e definir o registro novamente:

# -*- encoding: utf-8 -*-
#
# script to register Python 2.0 or later for use with win32all
# and other extensions that require Python registry settings
#
# Adapted by Ned Batchelder from a script
# written by Joakim Löw for Secret Labs AB / PythonWare
#
# source:
# http://www.pythonware.com/products/works/articles/regpy20.htm

import sys

from _winreg import *

# 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, 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)

if __name__ == "__main__":
    RegisterPy()

Execute esse script com o Python que você deseja registrar e ele será inserido no registro. Observe que no Windows 7 e Vista, você precisará de privilégios de administrador.

Ned Batchelder
fonte
1
No Windows 7, 64 bits, com 64 bits Python teve que modificar RegPath pararegpath = "SOFTWARE\\Wow6432Node\\Python\\Pythoncore\\%s\\" % (version)
Oleksiy
Na verdade, para o meu windows 7, 64 bits, deixei o regpath como está e funcionou. O mod @Oleksiy sugerido não funcionou. Provavelmente alguns sutis diferentes em nossa versão do sistema operacional, ou alguma configuração.
Paul
A solução da @Ned Batchelder foi a única que funcionou para mim. A instalação da roda não funcionou. Ainda recebi erros de download de pacotes (veja meu comentário sobre essa resposta para obter mais detalhes). A sugestão para fazer o easy_install binary_installer ... pode ter funcionado, mas não foi possível obter o easy_install para encontrar o arquivo binary_installer ... exe.
Paul
7

O easy_install é capaz de instalar pacotes .exe desde que tenham sido criados usando o destino bdist_wininst do distutils, que abrange muitos pacotes populares. No entanto, existem muitas outras que não são (wxPython é uma que eu lutei)

Simon King
fonte
Sim, e desde que você tenha instalado qualquer pacote de desenvolvimento de todas as dependências. No meu caso, a pycuda precisa do Boost e da CUDA, não de uma tarefa trivial.
Ned Batchelder
1
@ Ned Batchelder Sim, e desde que você instale qualquer pacote de desenvolvimento de todas as dependências. Bem, o instalador binário não instala todas as dependências, não é?
Piotr Dobrogost
0

Você pode usar o easy_install do ambiente para instalar o PyCUDA.

dev-env-path/bin/easy_install pycuda

ele lhe dará a mesma versão 0.94rc.

No Windows, o easy_install.exe estará no diretório Scripts.

simplyharsh
fonte
1
Infelizmente, isso tentará criar a partir do código-fonte. Eu esperava usar binários pré-criados.
Ned Batchelder
0

Se for um .msi, você poderá especificar opções de linha de comando usando msiexec. O próprio instalador do Python permite TARGETDIR, mas não tenho certeza se o distutils faz isso com instaladores de distribuição.

Se você estiver usando um .exe, não acho que exista uma maneira limpa. Uma opção é usar um programa como 7Zip (ou winzip, etc) para extrair diretamente o conteúdo do exe e, em seguida, copiar as pastas relevantes na pasta de pacotes de sites virtuais. Por exemplo, se eu extrair "processing-0.5.2.win32-py2.5.exe", localizo uma pasta "PLATLIB \ processing" que copio para um caminho virtualenv e uso sem problemas de tempo de execução. (Não tenho certeza se é sempre assim tão simples.)

ars
fonte