¿Puedo instalar paquetes de Windows Python en virtualenvs?

125

Virtualenv es genial: me permite mantener varias instalaciones distintas de Python para que las dependencias de diferentes proyectos no se agrupen en una pila común.

Pero si quiero instalar un paquete en Windows que está empaquetado como un instalador .exe, ¿cómo puedo dirigirlo para que se instale en virtualenv? Por ejemplo, tengo pycuda-0.94rc.win32-py2.6.exe. Cuando lo ejecuto, examina el registro y encuentra solo un Python26 para instalar, el común en el que se basa mi virtualenv.

¿Cómo puedo ordenar que se instale en virtualenv?

Ned Batchelder
fuente
1
la respuesta a continuación me funciona stackoverflow.com/questions/6114115/…
user1960422

Respuestas:

201

Sí tu puedes. Todo lo que necesitas es

easy_install binary_installer_built_with_distutils.exe

¿Sorprendido? Parece que los instaladores binarios para Windows hechos con distutils combinan .exe con .zip en un archivo .exe. Cambie la extensión a .zip para ver que es un archivo zip válido. Descubrí esto después de leer las respuestas a mi pregunta ¿Dónde puedo descargar huevos binarios con psycopg2 para Windows?

ACTUALIZAR

Como señaló Tritium21 en su respuesta hoy en día, debe usar pip en lugar de easy_install. Pip no puede instalar paquetes binarios creados por distutils pero puede instalar paquetes binarios en el nuevo formato de rueda . Puede convertir el formato anterior al nuevo utilizando el paquete de rueda , que primero debe instalar.

Piotr Dobrogost
fuente
2
Estoy de acuerdo, esto es genial. Por cierto, si tiene 7zip, puede abrir el archivo .exe directamente, sin tener que renombrarlo como zip.
Sabuncu
55
solo un consejo: los desarrolladores pueden descargar varios paquetes de Python para Windows desde lfd.uci.edu/~gohlke/pythonlibs .
yangzh
@CodyHatch Puedes, ya que esta no es mi única respuesta en SO y existe la posibilidad de que algunas de mis otras respuestas también te sean útiles :)
Piotr Dobrogost
1
Obtengo lo siguiente: Buscando binary-installer-built-with-distutils.exe Reading pypi.python.org/simple/… Reading pypi.python.org/simple/… No se pudo encontrar la página de índice para 'binary_installer_built_with_distutils.exe' Análisis del índice de todos los paquetes (esto puede llevar un tiempo) Lectura pypi.python.org/simple No se encontraron paquetes locales o enlaces de descarga para el error binary-installer-built-with-distutils.exe: no se pudo encontrar la distribución adecuada para Requirement.parse ('binary-instal ler-built-with-d ...
Paul
1
Paul, el exe al que se refiere será diferente dependiendo del instalador que estés usando ... no literalmente "binary-installer-built-with-distutils.exe"
Tristan Reid
70

Sé que esta es una pregunta bastante antigua, y es anterior a las herramientas de las que voy a hablar, pero por el bien de Google, creo que es una buena idea mencionarla. easy_install es la oveja negra del empaque de python. Nadie quiere admitir que lo usó con el nuevo calor de pip alrededor. Además, si bien jugar trucos de registro funcionará mejor para instaladores EXE no estándar (alguien construyó el instalador ellos mismos en lugar de usar distutils y está verificando el registro para la ruta de instalación), ahora hay una Mejor manera (c) para instaladores EXE estándar .

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

El formato de rueda, presentado recientemente a partir de esta publicación, es el reemplazo del formato de huevo, desempeñando el mismo papel. Este formato también es compatible con pip (una herramienta ya instalada en su virtualenv).

si por alguna razón pip install WHEELFILEno funciona, intentewheel install WHEELFILE

Tritio21
fuente
Gracias por esto. ¡Ojalá más personas noten tu respuesta y voten!
Brett Stottlemyer
Para ser claro. Puede crear un .whl desde un .exe, por ejemplo desde lfd.uci.edu/~gohlke/pythonlibs , con esto. ¡Esto es ENORME im términos de implementación!
Jonas Gröger
Intenté hacer esto, pero obtuve un error en la rueda de conversión numpy-MKL-1.8.1.win-amd64-py2.7.exe y luego pip install numpy-1.8.1-cp27-none-win_amd64.whl obtengo el siguiente error Descarga / desempaquetado numpy-1.8.1-cp27-none-win-amd64.whl No se encontraron descargas que satisfagan el requisito numpy-1.8.1-cp27-non e-win-amd64.whl No se encontraron distribuciones para numpy -1.8.1-cp27-none-win-amd64.whl
Paul
intente wheel install WHEELFILE, responda editado para señalar la existencia de eso. La depuración de un problema específico para alguien no es algo trivial en los comentarios SO.
Tritium21
Después de necesitar easy_install tantas veces solo para este propósito, fue hermoso. * con lágrimas en los ojos se despide de easy_install
KobeJohn
40

Terminé adaptando un script ( http://effbot.org/zone/python-register.htm ) para registrar una instalación de Python en el registro. Puedo escoger el pitón ser el pitón en el registro, ejecute el instalador de Windows, a continuación, establezca la parte posterior del registro:

# -*- 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()

Ejecute este script con el Python que desea registrar y se ingresará en el registro. Tenga en cuenta que en Windows 7 y Vista, necesitará privilegios de administrador.

Ned Batchelder
fuente
1
En Windows 7, 64 bits, con Python de 64 bits tuvo que modificar regpath aregpath = "SOFTWARE\\Wow6432Node\\Python\\Pythoncore\\%s\\" % (version)
Oleksiy
En realidad, para mi Windows 7 de 64 bits, dejé el regpath tal como está y funcionó. El mod que @Oleksiy sugirió no funcionó. Probablemente algunos sutiles diferentes en nuestra versión del sistema operativo, o alguna configuración.
Paul
La solución de @Ned Batchelder fue la única que funcionó para mí. La instalación de la rueda no funcionó. Todavía recibí errores de descarga del paquete (vea mi comentario sobre esa respuesta para obtener más detalles). La sugerencia de hacer el easy_install binary_installer ... puede haber funcionado pero no pude obtener easy_install para encontrar el archivo binary_installer ... exe.
Paul
7

easy_install puede instalar paquetes .exe siempre que se hayan creado utilizando el destino bdist_wininst de distutils, que cubre muchos paquetes populares. Sin embargo, hay muchos otros que no lo son (wxPython es uno con el que he luchado)

Simon King
fuente
Sí, y siempre que haya instalado el paquete de desarrollo de todas las dependencias. En mi caso, pycuda necesita Boost y CUDA, no una tarea trivial.
Ned Batchelder
1
@Ned Batchelder Sí, y siempre que haya instalado cualquier paquete de desarrollo de todas las dependencias. Bueno, el instalador binario tampoco instala todas las dependencias, ¿verdad?
Piotr Dobrogost
0

Puede usar easy_install del entorno para instalar PyCUDA.

dev-env-path/bin/easy_install pycuda

te dará la misma versión 0.94rc.

En Windows, easy_install.exe estará en el directorio Scripts.

simplemente duro
fuente
1
Desafortunadamente, esto intentará construir desde la fuente. Esperaba usar binarios preconstruidos.
Ned Batchelder
0

Si es un .msi, puede especificar las opciones de línea de comando usando msiexec. El instalador de Python sí lo permite TARGETDIR, pero no estoy seguro de si distutils incorpora esto a los instaladores de distribución.

Si está utilizando un .exe, no creo que haya una manera limpia. Una opción es usar un programa como 7Zip (o winzip, etc.) para extraer directamente el contenido del exe, luego copiar las carpetas relevantes en su carpeta virtual de paquetes de sitio. Por ejemplo, si extraigo "processing-0.5.2.win32-py2.5.exe", encuentro una carpeta "PLATLIB \ processing" que copio en una ruta virtualenv y uso sin ningún problema de tiempo de ejecución. (No estoy seguro de que siempre sea así de simple).

ars
fuente