web-dev-qa-db-fra.com

Puis-je installer Python packages Windows dans virtualenvs?

Virtualenv est génial: il me permet de conserver un certain nombre d'installations distinctes Python afin que les dépendances des différents projets ne soient pas toutes regroupées dans une pile commune.

Mais si je veux installer un package sur Windows qui est fourni en tant que programme d'installation .exe, comment puis-je le diriger pour qu'il s'installe dans virtualenv? Par exemple, j'ai pycuda-0.94rc.win32-py2.6.exe. Lorsque je l'exécute, il examine le registre et ne trouve qu'un seul Python26 dans lequel installer, celui commun sur lequel mon virtualenv est basé.

Comment puis-je l'installer dans virtualenv?

124
Ned Batchelder

J'ai fini par adapter un script ( http://effbot.org/zone/python-register.htm ) pour enregistrer une installation Python dans le registre. Je peux choisissez le Python pour être le Python dans le registre, exécutez Windows programme d'installation, puis réinitialisez le registre:

# -*- 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 __== "__main__":
    RegisterPy()

Exécutez ce script avec le Python que vous souhaitez être enregistré, et il sera entré dans le registre. Notez que sur Windows 7 et Vista, vous aurez besoin des privilèges d'administrateur.

40
Ned Batchelder

Oui, vous pouvez. Tout ce dont tu as besoin c'est

easy_install binary_installer_built_with_distutils.exe

Surpris? Il semble que les programmes d'installation binaires pour Windows créés avec distutils combinent .exe avec .Zip dans un fichier .exe. Changez l'extension en .Zip pour voir qu'il s'agit d'un fichier Zip valide. J'ai découvert cela après avoir lu les réponses à ma question Où puis-je télécharger des œufs binaires avec psycopg2 pour Windows?

MISE À JOUR

Comme l'a noté Tritium21 dans sa réponse de nos jours, vous devriez utiliser pip au lieu de easy_install. Pip ne peut pas installer de packages binaires créés par distutils mais il peut installer des packages binaires au nouveau format wheel . Vous pouvez convertir de l'ancien format au nouveau en utilisant le package wheel , que vous devez d'abord installer.

200
Piotr Dobrogost

Je sais que c'est une question assez ancienne et antérieure aux outils dont je vais parler, mais pour le bien de Google, je pense que c'est une bonne idée de le mentionner. easy_install est le mouton noir de l'empaquetage python. Personne ne veut admettre son utilisation avec la nouvelle chaleur de pip autour. De plus, tout en jouant des astuces de registre fonctionnera mieux pour les installateurs EXE non standard (quelqu'un construit l'installateur lui-même au lieu d'utiliser distutils, et vérifie le registre pour le chemin d'installation), il existe maintenant un meilleur moyen (c) pour les installateurs EXE standard.

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

Le format de roue, introduit récemment à partir de ce billet, remplace le format Egg, remplissant à peu près le même rôle. Ce format est également supporté par pip (un outil déjà installé dans votre virtualenv).

si pour une raison quelconque pip install WHEELFILE ne fonctionne pas, essayez wheel install WHEELFILE

70
Tritium21

easy_install est capable d'installer des packages .exe tant qu'ils ont été construits à l'aide de la cible bdist_wininst de distutils, qui couvre de nombreux packages populaires. Cependant, il y en a beaucoup d'autres qui ne le sont pas (wxPython est celui avec lequel j'ai eu du mal)

7
Simon King

Vous pouvez utiliser easy_install de l'environnement pour installer PyCUDA.

dev-env-path/bin/easy_install pycuda

il vous donnera la même version 0.94rc.

Sous Windows, easy_install.exe se trouvera dans le répertoire Scripts.

0
simplyharsh

Si c'est un .msi, vous pourrez peut-être spécifier des options de ligne de commande à l'aide de msiexec. Le Python programme d'installation lui-même autorise TARGETDIR, mais je ne suis pas sûr que distutils le fasse dans les programmes d'installation de distribution.

Si vous utilisez un .exe, Je ne pense pas qu'il y ait un moyen propre. Une option consiste à utiliser un programme comme 7Zip (ou winzip, etc.) pour extraire directement le contenu de l'exe, puis copier les dossiers pertinents dans votre dossier de site-packages virtuels. Par exemple, si j'extrait "processing-0.5.2.win32-py2.5.exe", je trouve un dossier "PLATLIB\processing" que je copie dans un chemin virtualenv et que j'utilise sans aucun problème d'exécution. (Je ne suis pas sûr que ce soit toujours aussi simple.)

0
ars