Posso installare i pacchetti di Windows Python in virtualenvs?


125

Virtualenv è fantastico: mi permette di mantenere un numero di installazioni Python distinte in modo che le dipendenze di diversi progetti non siano tutte messe insieme in un mucchio comune.

Ma se voglio installare un pacchetto su Windows impacchettato come programma di installazione .exe, come posso indirizzarlo per l'installazione in virtualenv? Ad esempio, ho pycuda-0.94rc.win32-py2.6.exe. Quando lo eseguo, esamina il registro e trova solo un Python26 da installare, quello comune su cui si basa il mio virtualenv.

Come posso indirizzarlo per l'installazione in virtualenv?


Risposte:


201

Si, puoi. Tutto ciò che serve è

easy_install binary_installer_built_with_distutils.exe

Sorpreso? Sembra che i programmi di installazione binari per Windows realizzati con distutils combinino .exe con .zip in un file .exe. Cambia l'estensione in .zip per vedere che è un file zip valido. L'ho scoperto dopo aver letto le risposte alla mia domanda Dove posso scaricare uova binarie con psycopg2 per Windows?

AGGIORNARE

Come notato da Tritium21 nella sua risposta al giorno d'oggi, dovresti usare pip invece di easy_install. Pip non può installare pacchetti binari creati da distutils ma può installare pacchetti binari nel nuovo formato di ruota . Puoi convertire dal vecchio formato a quello nuovo usando il pacchetto wheel , che devi prima installare.


2
Sono d'accordo, è grandioso. A proposito, se hai 7zip, puoi aprire direttamente .exe, senza doverlo rinominare come zip.
Sabuncu,

5
solo un consiglio: gli sviluppatori possono scaricare vari pacchetti python integrati per Windows da lfd.uci.edu/~gohlke/pythonlibs .
yangzh,

@CodyHatch È possibile poiché questa non è la mia unica risposta su SO e c'è la possibilità che anche alcune delle mie altre risposte possano esserti utili :)
Piotr Dobrogost,

1
Ottengo quanto segue: Ricerca binary-installer-built-with-distutils.exe Lettura pypi.python.org/simple/… Lettura pypi.python.org/simple/… Impossibile trovare la pagina dell'indice per 'binary_installer_built_with_distutils.exe' Scansione dell'indice di tutti i pacchetti (l'operazione potrebbe richiedere del tempo) Lettura di pypi.python.org/simple Nessun pacchetto locale o collegamento per il download trovato per errore binary-installer-built-with-distutils.exe: impossibile trovare la distribuzione adatta per Requirement.parse ('binary-instal ler-built-with-d ...
Paul

1
Paul, l'exe a cui si riferisce sarà diverso a seconda dell'installer che stai usando ... non letteralmente "binary-installer-built-with-distutils.exe"
Tristan Reid

70

So che questa è una domanda piuttosto vecchia e precede gli strumenti di cui sto per parlare, ma per il bene di Google, penso che sia una buona idea parlarne. easy_install è la pecora nera del packaging in pitone. Nessuno vuole ammettere di usarlo con il nuovo calore di pip in giro. Inoltre, durante la riproduzione dei trucchi del registro funzionerà meglio per i programmi di installazione EXE non standard (qualcuno ha creato il programma di installazione stesso invece di usare distutils e sta controllando il registro per il percorso di installazione), ora c'è un modo migliore (c) per i programmi di installazione EXE standard .

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

Il formato della ruota, introdotto di recente a partire da questo post, è il sostituto del formato uovo, ricoprendo lo stesso ruolo. Questo formato è supportato anche da pip (uno strumento già installato nel tuo virtualenv).

se per qualche motivo pip install WHEELFILEnon funziona, provarewheel install WHEELFILE


Grazie per questo. Spero che più persone notino la tua risposta e il tuo voto!
Brett Stottlemyer,

Per essere chiari. È possibile creare un .whl da un .exe, ad esempio da lfd.uci.edu/~gohlke/pythonlibs , con questo. Questo è ENORME in termini di implementazione!
Jonas Gröger,

Ho provato a fare questo, ma ho ottenuto una rotella di errore convertire numpy-MKL-1.8.1.win-amd64-py2.7.exe quindi installare pip numpy-1.8.1-cp27-none-win_amd64.whl ottengo il seguente errore Download / decompressione numpy-1.8.1-cp27-none-win-amd64.whl Impossibile trovare download che soddisfino il requisito numpy-1.8.1-cp27-non e-win-amd64.whl Nessuna distribuzione trovata per numpy -1.8.1-cp27-none-win-amd64.whl
Paul

prova wheel install WHEELFILE, rispondi modificato per evidenziarne l'esistenza. Il debug di un problema specifico per qualcuno non è qualcosa di banale nei commenti SO.
Tritium21

Dopo aver bisogno di easy_install tante volte solo per questo scopo, è stato bellissimo. * saluta in lacrime addio a
easy_install

40

Ho finito per adattare uno script ( http://effbot.org/zone/python-register.htm ) per registrare un'installazione di Python nel registro. Posso scegliere il Python di essere il Python nel Registro di sistema, eseguire il programma di installazione di Windows, quindi impostare la parte posteriore di 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()

Esegui questo script con Python che desideri registrare e verrà inserito nel registro. Nota che su Windows 7 e Vista avrai bisogno dei privilegi di amministratore.


1
Su Windows 7, 64 bit, con 64 bit Python ha dovuto modificare regpath inregpath = "SOFTWARE\\Wow6432Node\\Python\\Pythoncore\\%s\\" % (version)
Oleksiy,

In realtà per il mio Windows 7, 64 bit, ho lasciato il regpath così com'è e ha funzionato. La mod @Oleksiy ha suggerito di non funzionare. Probabilmente alcuni leggermente diversi nella nostra versione del sistema operativo o alcune impostazioni.
Paul,

La soluzione di @Ned Batchelder è stata l'unica che ha funzionato per me. L'installazione della ruota non ha funzionato. Ho ancora ricevuto errori di download del pacchetto (vedi il mio commento su quella risposta per maggiori dettagli). Il suggerimento di fare il file binario_installer easy_install ... potrebbe aver funzionato ma non sono riuscito a trovare easy_install per trovare il file exe binary_installer ...
Paul,

7

easy_install è in grado di installare pacchetti .exe fintanto che sono stati creati usando il target bdist_wininst di distutils, che copre molti pacchetti popolari. Tuttavia, ci sono molti altri che non lo sono (wxPython è uno con cui ho lottato)


Sì, e purché tu abbia installato qualunque pacchetto di sviluppo di tutte le dipendenze. Nel mio caso, pycuda ha bisogno di Boost e CUDA, non un'impresa banale.
Ned Batchelder,

1
@Ned Batchelder Sì, e purché tu abbia installato qualunque pacchetto di sviluppo di tutte le dipendenze. Bene, neanche l'installer binario installa tutte le dipendenze, vero?
Piotr Dobrogost,

0

È possibile utilizzare easy_install dell'ambiente per installare PyCUDA.

dev-env-path/bin/easy_install pycuda

ti darà la stessa versione 0.94rc.

Su Windows easy_install.exe si troverà nella directory degli script.


1
Sfortunatamente, questo proverà a costruire dalla fonte. Speravo di usare i binari predefiniti.
Ned Batchelder,

0

Se è un .msi, potresti essere in grado di specificare le opzioni della riga di comando usando msiexec. Lo stesso programma di installazione di Python lo consente TARGETDIR, ma non sono sicuro che distutils lo installi nei programmi di installazione della distribuzione.

Se stai usando un .exe, non penso che ci sia un modo pulito. Un'opzione è usare un programma come 7Zip (o winzip, ecc.) Per estrarre direttamente il contenuto dell'exe, quindi copiare le cartelle rilevanti nella cartella dei pacchetti del sito virtuale. Ad esempio, se estraggo "processing-0.5.2.win32-py2.5.exe", trovo una cartella "PLATLIB \ processing" che copio su un percorso virtualenv e utilizzo senza problemi di runtime. (Non sono sicuro che sia sempre così semplice.)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.