¿Puedo instalar paquetes de Python Windows en virtualenvs?


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

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

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

Author: Ned Batchelder, 2010-07-17

6 answers

Sí, puedes. Todo lo que necesitas es

Easy_install binary_installer_build_with_distutils.exe

Sorprendido? Se parece a los instaladores binarios para Windows hechos con la combinación de distutils .exe con .cierra en uno .archivo exe. Cambiar 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 deberías 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 wheel. Puede convertir del formato antiguo al nuevo usando el paquete wheel, que debe instalar primero.

 200
Author: Piotr Dobrogost,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:02:39

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

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

El formato de rueda, introducido recientemente a partir de este post, es el reemplazo para el formato de huevo, llenando casi 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 WHEELFILE no funciona, intente wheel install WHEELFILE

 70
Author: Tritium21,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-09 23:05:48

Terminé adaptando un script ( http://effbot.org/zone/python-register.htm ) para registrar una instalación de Python en el registro. Puedo elegir que Python sea el Python en el registro, ejecutar el instalador de Windows y luego volver a configurar el 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.

 40
Author: Ned Batchelder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-17 20:41:43

Easy_install es capaz de instalar .paquetes exe siempre y cuando hayan sido construidos usando el objetivo 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)

 7
Author: Simon King,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-18 08:52:40

Puede usar easy_install del entorno para instalar PyCUDA.

dev-env-path/bin/easy_install pycuda

Te dará la misma versión 0.94 rc.

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

 0
Author: simplyharsh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-17 13:38:06

Si se trata de un .msi, es posible que pueda especificar opciones de línea de comandos utilizando msiexec. El instalador de Python permite TARGETDIR, pero no estoy seguro de si distutils hornea esto en los instaladores de distribución.

Si estás usando 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 site-packages. Por ejemplo, si extraigo "processing-0.5.2.win32-py2. 5.exe", encuentro una carpeta "PLATLIB \ processing" que copio a una ruta virtualenv y uso sin problemas de tiempo de ejecución. (Aunque no estoy seguro de que siempre sea tan simple.)

 0
Author: ars,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-17 17:20:11