2010-07-17 11 views
123

Virtualenv es genial: me permite mantener una cantidad de instalaciones de Python distintas para que las dependencias de los diferentes proyectos no se unan en una pila común.¿Puedo instalar paquetes de Windows Python en virtualenvs?

Pero si quiero instalar un paquete en Windows empaquetado como un instalador .exe, ¿cómo puedo dirigirlo para que se instale en el 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 más común sobre el cual se basa mi virtualenv.

¿Cómo puedo dirigirlo para instalarlo en Virtualenv?

+1

la respuesta a continuación funciona para mí http://stackoverflow.com/questions/6114115/windows-virtualenv-pip-numpy-problems-when- installation-numpy – user1960422

Respuesta

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 la Python en el registro, ejecute el instalador de Windows, a continuación, establecer el registro de nuevo:

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

Ejecutar este proceso con el pitón desea ser registrado, y se ingresará en el registro. Tenga en cuenta que en Windows 7 y Vista, necesitará privilegios de administrador.

+2

Esto es genial; gracias por compartirlo con la comunidad. – Profane

+1

En Windows 7, 64 bit, con 64 bit Python tuvo que modificar regpath para 'regpath = "SOFTWARE \\ Wow6432Node \\ Python \\ Pythoncore \\% s \\"% (version) ' – Oleksiy

+0

En realidad para mi windows 7, 64 bit, dejé el regpath como está y funcionó. El mod @Oleksiy sugerido no funcionó. Probablemente algunos sutiles diferentes en nuestra versión del sistema operativo, o alguna configuración. – Paul

0

Puede usar easy_install de environment para instalar PyCUDA.

dev-env-path/bin/easy_install pycuda 

le dará la misma versión 0.94rc.

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

+1

Desafortunadamente, esto intentará compilar desde el origen. Esperaba usar binarios preconstruidos. –

0

Si es .msi, es posible que pueda especificar opciones de línea de comando usando msiexec. El Python installer en sí mismo permite TARGETDIR, pero no estoy seguro si distutils hornea esto en los instaladores de distribución.

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

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)

+0

Sí, y siempre que haya instalado cualquier paquete de desarrollo de todas las dependencias. En mi caso, pycuda necesita Boost y CUDA, no es una empresa trivial. –

+1

@Ned Batchelder * Sí, y siempre que haya instalado el paquete de desarrollo de todas las dependencias. * Bueno, el instalador binario tampoco instala todas las dependencias, ¿o sí? –

197

Sí, puedes. Todo lo que necesita es

easy_install binary_installer_built_with_distutils.exe

Sorprendido? Parece que los instaladores binarios para Windows creados con distutils combinan .exe con .zip en un archivo .exe. Cambia 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 Where can I download binary eggs with psycopg2 for Windows?

ACTUALIZACIÓN

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

+14

Eso es fantástico. Ojalá pudiera votarte más de una vez. –

+2

Estoy de acuerdo, esto es genial. Por cierto, si tiene 7zip, puede abrir el .exe directamente, sin tener que cambiarle el nombre como zip. – Sabuncu

+5

solo un consejo: los desarrolladores pueden descargar varios paquetes python creados para Windows desde http://www.lfd.uci.edu/~gohlke/pythonlibs/. – yangzh

68

Sé que esta es una pregunta bastante antigua, y es anterior a las herramientas de las que estoy hablando, pero por el bien de Google, creo que es una buena idea mencionarlo. easy_install es la oveja negra del empaque de pitón. Nadie quiere admitir usarlo con el nuevo calor de la pipa. Además, al jugar trucos de registro funcionará mejor para los instaladores EXE no estándar (alguien construyó el instalador por sí mismo en lugar de usar distutils y está verificando el registro para la ruta de instalación), ahora hay una forma mejor (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, presentado recientemente en esta publicación, reemplaza al formato de huevo, desempeñando casi el mismo papel. Este formato también es compatible con pip (una herramienta ya instalada en su virtual).

si por alguna razón pip install WHEELFILE no funciona, intente wheel install WHEELFILE

+0

Gracias por esto. ¡Con suerte, más personas notarán su respuesta y voto positivo! –

+0

Para ser claro. Puede crear .whl desde .exe, por ejemplo desde http://www.lfd.uci.edu/~gohlke/pythonlibs/, con esto. ¡Esto es ENORME en términos de implementación! –

+0

Intenté hacer esto, pero obtuve una rueda de error para convertir numpy-MKL-1.8.1.win-amd64-py2.7.exe y luego pip install numpy-1.8.1-cp27-none-win_amd64.whl obtengo lo siguiente Error al descargar/desempaquetar numpy-1.8.1-cp27-none-win-amd64.whl No se pudo encontrar ninguna descarga que satisfaga el requisito numpy-1.8.1-cp27-no e-win-amd64.whl Sin distribuciones en todos encontrados para numpy-1.8.1-cp27-none-win-amd64.whl – Paul

Cuestiones relacionadas