Kann ich Python-Windows-Pakete in virtualenvs installieren?

125

Virtualenv ist großartig: Ich kann eine Reihe unterschiedlicher Python-Installationen beibehalten, damit die Abhängigkeiten verschiedener Projekte nicht alle zu einem gemeinsamen Stapel zusammengefasst werden.

Aber wenn ich ein Paket unter Windows installieren möchte, das als EXE-Installationsprogramm gepackt ist, wie kann ich es anweisen, es in der virtuellen Umgebung zu installieren? Zum Beispiel habe ich pycuda-0.94rc.win32-py2.6.exe. Wenn ich es ausführe, überprüft es die Registrierung und findet nur einen Python26, in den es installiert werden kann, den allgemeinen, auf dem meine virtuelle Umgebung basiert.

Wie kann ich es anweisen, in der virtuellen Umgebung zu installieren?

Ned Batchelder
quelle
1
Die Antwort unten funktioniert für mich stackoverflow.com/questions/6114115/…
user1960422

Antworten:

201

Ja, du kannst. Alles was Sie brauchen ist

easy_install binary_installer_built_with_distutils.exe

Überrascht? Es sieht so aus, als würden Binärinstallationsprogramme für Windows, die mit distutils erstellt wurden, EXE mit ZIP in einer EXE-Datei kombinieren. Ändern Sie die Erweiterung in .zip, um festzustellen, ob es sich um eine gültige Zip-Datei handelt. Ich habe dies entdeckt, nachdem ich Antworten auf meine Frage gelesen hatte. Wo kann ich binäre Eier mit psycopg2 für Windows herunterladen?

AKTUALISIEREN

Wie Tritium21 in seiner heutigen Antwort feststellte, sollten Sie pip anstelle von easy_install verwenden. Pip kann durch distutils erstellt Binärpakete nicht installieren , aber es kann Binärpakete im neuen installieren Rad - Format. Sie können aus altem Format in die neuen konvertieren mit Rad - Paket, das Sie zuerst installieren.

Piotr Dobrogost
quelle
2
Ich stimme zu, das ist großartig. Übrigens, wenn Sie 7zip haben, können Sie die EXE-Datei direkt öffnen, ohne sie in zip umbenennen zu müssen.
Sabuncu
5
Nur ein Tipp: Entwickler können verschiedene erstellte Python-Pakete für Windows von lfd.uci.edu/~gohlke/pythonlibs herunterladen .
Yangzh
@CodyHatch Sie können, da dies nicht meine einzige Antwort auf SO ist und es eine Chance gibt, dass einige meiner anderen Antworten auch für Sie hilfreich sind :)
Piotr Dobrogost
1
Ich erhalte Folgendes: Suche nach Binärinstallationsprogramm, das mit distutils.exe erstellt wurde Lesen von pypi.python.org/simple/… Lesen von pypi.python.org/simple/… Indexseite für 'binary_installer_built_with_distutils.exe' konnte nicht gefunden werden Scannen des Index aller Pakete (dies kann eine Weile dauern) Lesen von pypi.python.org/simple Keine lokalen Pakete oder Download-Links für den Fehler "Binärinstallationsprogramm mit Distutils.exe" gefunden: Es wurde keine geeignete Distribution für "Requirement.parse" gefunden ('binär-instal ler-gebaut-mit-d ...
Paul
1
Paul, die Exe, auf die er sich bezieht, hängt davon ab, welchen Installer Sie verwenden ... nicht wörtlich "Binär-Installer-erstellt-mit-distutils.exe"
Tristan Reid
70

Ich weiß, dass dies eine ziemlich alte Frage ist und älter ist als die Tools, über die ich sprechen werde, aber für Google halte ich es für eine gute Idee, sie zu erwähnen. easy_install ist das schwarze Schaf der Python-Verpackung. Niemand möchte zugeben, dass er es mit der neuen Schärfe von Pip verwendet. Während das Spielen von Registrierungstricks für nicht standardmäßige EXE-Installer am besten funktioniert (jemand hat das Installationsprogramm selbst erstellt, anstatt distutils zu verwenden, und überprüft die Registrierung auf den Installationspfad), gibt es jetzt einen besseren Weg (c) für Standard-EXE-Installer .

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

Das kürzlich in diesem Beitrag eingeführte Radformat ist der Ersatz für das Eiformat und spielt fast die gleiche Rolle. Dieses Format wird auch von pip unterstützt (einem Tool, das bereits in Ihrer virtuellen Umgebung installiert ist).

Wenn es aus irgendeinem Grund pip install WHEELFILEnicht funktioniert, versuchen Sie eswheel install WHEELFILE

Tritium21
quelle
Danke dafür. Hoffentlich bemerken mehr Leute Ihre Antwort und stimmen zu!
Brett Stottlemyer
Deutlich sein. Damit können Sie eine .whl aus einer .exe erstellen, beispielsweise aus lfd.uci.edu/~gohlke/pythonlibs . Dies ist im Hinblick auf die Bereitstellung RIESIG!
Jonas Gröger
Ich habe versucht, dies zu tun, aber ein Fehlerrad konvertiert numpy-MKL-1.8.1.win-amd64-py2.7.exe dann pip install numpy-1.8.1-cp27-none-win_amd64.whl Ich erhalte den folgenden Fehler Herunterladen / Entpacken von numpy-1.8.1-cp27-none-win-amd64.whl Es wurden keine Downloads gefunden, die die Anforderung numpy-1.8.1-cp27-non e-win-amd64.whl erfüllen. Für numpy wurden überhaupt keine Distributionen gefunden -1.8.1-cp27-none-win-amd64.whl
Paul
versuchen Sie wheel install WHEELFILE, antworten Sie bearbeitet, um auf die Existenz davon hinzuweisen. Das Debuggen eines bestimmten Problems für jemanden ist in SO-Kommentaren nicht trivial.
Tritium21
Nachdem easy_install nur für diesen Zweck so oft benötigt wurde, war das wunderschön. * winkt unter Tränen zum Abschied von easy_install
KobeJohn
40

Am Ende habe ich ein Skript ( http://effbot.org/zone/python-register.htm ) angepasst , um eine Python-Installation in der Registrierung zu registrieren. Ich kann den Python holen zu sein der Python in der Registrierung, das Windows - Installationsprogramm ausführen, dann die Registrierung wieder eingestellt:

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

Führen Sie dieses Skript mit dem Python aus, für den Sie registriert werden möchten, und es wird in die Registrierung eingegeben. Beachten Sie, dass Sie unter Windows 7 und Vista Administratorrechte benötigen.

Ned Batchelder
quelle
1
Unter Windows 7 musste 64-Bit mit 64-Bit-Python den Regpath aufregpath = "SOFTWARE\\Wow6432Node\\Python\\Pythoncore\\%s\\" % (version)
Oleksiy
Eigentlich habe ich für mein Windows 7, 64-Bit den Regpath unverändert gelassen und es hat funktioniert. Der Mod @Oleksiy schlug vor, nicht zu funktionieren. Wahrscheinlich ein subtiler Unterschied in unserer Betriebssystemversion oder eine Einstellung.
Paul
Die Lösung von @Ned Batchelder war die einzige, die für mich funktioniert hat. Die Radmontage hat nicht funktioniert. Ich habe immer noch Fehler beim Herunterladen von Paketen erhalten (siehe meinen Kommentar zu dieser Antwort für weitere Details). Der Vorschlag, den easy_install binary_installer ... auszuführen, hat möglicherweise funktioniert, aber ich konnte easy_install nicht zum Auffinden der Exe-Datei binary_installer ... erhalten.
Paul
7

easy_install ist in der Lage, EXE-Pakete zu installieren, solange sie mit dem Ziel bdist_wininst von distutils erstellt wurden, das viele beliebte Pakete abdeckt. Es gibt jedoch viele andere, die dies nicht tun (wxPython ist eines, mit dem ich zu kämpfen habe)

Simon King
quelle
Ja, und solange Sie das Entwicklungspaket aller Abhängigkeiten installiert haben. In meinem Fall braucht Pycuda Boost und CUDA, kein triviales Unterfangen.
Ned Batchelder
1
@Ned Batchelder Ja, und solange Sie das Entwicklungspaket aller Abhängigkeiten installiert haben. Nun, das binäre Installationsprogramm installiert auch nicht alle Abhängigkeiten, oder?
Piotr Dobrogost
0

Sie können easy_install der Umgebung verwenden, um PyCUDA zu installieren.

dev-env-path/bin/easy_install pycuda

es wird Ihnen die gleiche Version 0.94rc geben.

Unter Windows befindet sich easy_install.exe im Skriptverzeichnis.

einfach hart
quelle
1
Leider wird dies versuchen, aus dem Quellcode zu erstellen. Ich hatte gehofft, vorgefertigte Binärdateien zu verwenden.
Ned Batchelder
0

Wenn dies der .msiFall ist, können Sie möglicherweise Befehlszeilenoptionen mit angeben msiexec. Das Python- Installationsprogramm selbst erlaubt es TARGETDIR, aber ich bin mir nicht sicher, ob distutils dies in Distributionsinstallationsprogrammen backt.

Wenn Sie ein verwenden .exe, gibt es meines Erachtens keinen sauberen Weg. Eine Möglichkeit besteht darin, ein Programm wie 7Zip (oder winzip usw.) zu verwenden, um den Inhalt der exe direkt zu extrahieren, und dann die relevanten Ordner in Ihren Ordner für virtuelle Site-Pakete zu kopieren. Wenn ich beispielsweise "procedure-0.5.2.win32-py2.5.exe" extrahiere, finde ich einen Ordner "PLATLIB \ process", den ich in einen virtuellen Pfad kopiere und ohne Laufzeitprobleme verwende. (Ich bin mir nicht sicher, ob es immer so einfach ist.)

ars
quelle