Puis-je installer des packages Windows Python dans virtualenvs?

125

Virtualenv est génial: cela me permet de conserver un certain nombre d'installations Python distinctes afin que les dépendances de différents projets ne soient pas toutes jetées ensemble 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 vers l'installation dans le 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 sur lequel mon virtualenv est basé.

Comment puis-je l'installer dans le virtualenv?

Ned Batchelder
la source
1
la réponse ci-dessous fonctionne pour moi stackoverflow.com/questions/6114115/…
user1960422

Réponses:

201

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

easy_install binary_installer_built_with_distutils.exe

Surpris? Il ressemble à des installateurs binaires pour Windows réalisés avec distutils combinant .exe avec .zip dans un seul 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?

METTRE À 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 dans le nouveau format de roue . Vous pouvez convertir l'ancien format au nouveau en utilisant le package wheel , que vous devez d'abord installer.

Piotr Dobrogost
la source
2
Je suis d'accord, c'est génial. D'ailleurs, si vous avez 7zip, vous pouvez ouvrir le .exe directement, sans avoir à le renommer en zip.
Sabuncu
5
juste un conseil: les développeurs peuvent télécharger divers packages python intégrés pour Windows à partir de lfd.uci.edu/~gohlke/pythonlibs .
yangzh
@CodyHatch Vous pouvez car ce n'est pas ma seule réponse sur SO et il y a une chance que certaines de mes autres réponses vous soient également utiles :)
Piotr Dobrogost
1
J'obtiens ce qui suit: Recherche de binary-installer-built-with-distutils.exe Lecture de pypi.python.org/simple/... Lecture de pypi.python.org/simple/… Impossible de trouver la page d'index pour 'binary_installer_built_with_distutils.exe' Analyse de l'index de tous les packages (cela peut prendre un certain temps) Lecture de pypi.python.org/simple Aucun package local ou lien de téléchargement trouvé pour l'erreur binary-installer-built-with-distutils.exe: Impossible de trouver la distribution appropriée pour Requirement.parse ('binary-instal ler-built-with-d ...
Paul
1
Paul, l'exe auquel il fait référence sera différent en fonction de l'installateur que vous utilisez ... pas littéralement "binary-installer-built-with-distutils.exe"
Tristan Reid
70

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 la mentionner. easy_install est le mouton noir de l'emballage python. Personne ne veut admettre l'avoir utilisé avec la nouvelle sensation de pépin. De plus, tout en jouant des astuces de registre fonctionnera mieux pour les installateurs EXE non standard (quelqu'un a construit le programme d'installation 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 cet article, remplace le format d'oeuf, remplissant à peu près le même rôle. Ce format est également pris en charge par pip (un outil déjà installé dans votre virtualenv).

si pour une raison quelconque pip install WHEELFILEne fonctionne pas, essayezwheel install WHEELFILE

Tritium21
la source
Merci pour cela. J'espère que plus de gens remarqueront votre réponse et votre vote favorable!
Brett Stottlemyer
Pour être clair. Vous pouvez créer un .whl depuis un .exe, par exemple depuis lfd.uci.edu/~gohlke/pythonlibs , avec this. C'est ÉNORME en termes de déploiement!
Jonas Gröger
J'ai essayé de le faire, mais j'ai obtenu une roue d'erreur convertir numpy-MKL-1.8.1.win-amd64-py2.7.exe puis pip installer numpy-1.8.1-cp27-none-win_amd64.whl j'obtiens l'erreur suivante Téléchargement / décompression numpy-1.8.1-cp27-none-win-amd64.whl Impossible de trouver des téléchargements répondant à l'exigence numpy-1.8.1-cp27-non e-win-amd64.whl Aucune distribution trouvée pour numpy -1.8.1-cp27-none-win-amd64.whl
Paul
essayez wheel install WHEELFILE, réponse modifiée pour souligner l'existence de cela. Déboguer un problème spécifique pour quelqu'un n'est pas quelque chose de trivial dans les commentaires SO.
Tritium21
Après avoir eu besoin d'easy_install tant de fois dans ce seul but, c'était magnifique. * dit au revoir en larmes à easy_install
KobeJohn
40

J'ai fini par adapter un script ( http://effbot.org/zone/python-register.htm ) pour enregistrer une installation Python dans le registre. Je peux choisir le Python pour être le Python dans le Registre, exécutez le programme d' installation de Windows, puis définissez l'arrière de 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 __name__ == "__main__":
    RegisterPy()

Exécutez ce script avec le Python que vous souhaitez enregistrer, et il sera inscrit dans le registre. Notez que sous Windows 7 et Vista, vous aurez besoin de privilèges d'administrateur.

Ned Batchelder
la source
1
Sur Windows 7, 64 bits, avec 64 bits, Python a dû modifier regpath enregpath = "SOFTWARE\\Wow6432Node\\Python\\Pythoncore\\%s\\" % (version)
Oleksiy
En fait, pour mes fenêtres 7, 64 bits, j'ai laissé le regpath tel quel et cela a fonctionné. Le mod @Oleksiy suggéré n'a pas fonctionné. Probablement une subtile différence dans notre version du système d'exploitation, ou un paramètre.
Paul
La solution de @Ned Batchelder était la seule qui fonctionnait pour moi. L'installation de la roue n'a pas fonctionné. J'ai toujours reçu des erreurs de téléchargement de package (voir mon commentaire sur cette réponse pour plus de détails). La suggestion de faire le easy_install binary_installer ... a peut-être fonctionné mais je n'ai pas pu obtenir easy_install pour trouver le fichier binary_installer ... exe.
Paul
7

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

Simon King
la source
Oui, et tant que vous avez installé le package de développement de toutes les dépendances. Dans mon cas, pycuda a besoin de Boost et de CUDA, ce n'est pas une entreprise insignifiante.
Ned Batchelder
1
@Ned Batchelder Oui, et tant que vous avez installé le package de développement de toutes les dépendances. Eh bien, l'installateur binaire n'installe pas non plus toutes les dépendances, n'est-ce pas?
Piotr Dobrogost
0

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 sera dans le répertoire Scripts.

simplement
la source
1
Malheureusement, cela essaiera de construire à partir des sources. J'espérais utiliser des binaires pré-construits.
Ned Batchelder
0

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

Si vous utilisez a .exe, je ne pense pas qu'il y ait un moyen propre. Une option consiste à utiliser un programme tel que 7Zip (ou winzip, etc.) pour extraire directement le contenu de l'exe, puis copier les dossiers concernés dans votre dossier de packages de sites 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.)

ars
la source