Czy mogę zainstalować pakiety Python dla systemu Windows w virtualenvs?

125

Virtualenv jest świetny: pozwala mi zachować wiele różnych instalacji Pythona, dzięki czemu zależności różnych projektów nie są wrzucane razem do wspólnego stosu.

Ale jeśli chcę zainstalować pakiet w systemie Windows, który jest spakowany jako instalator .exe, jak mogę skierować go do instalacji w virtualenv? Na przykład mam pycuda-0.94rc.win32-py2.6.exe. Po uruchomieniu sprawdza rejestr i znajduje tylko jeden Python26 do zainstalowania, wspólny, na którym opiera się mój virtualenv.

Jak mogę skierować go do instalacji w virtualenv?

Ned Batchelder
źródło
1
odpowiedź poniżej działa dla mnie stackoverflow.com/questions/6114115/ ...
user1960422

Odpowiedzi:

201

Tak, możesz. Wszystko czego potrzebujesz to

easy_install binary_installer_built_with_distutils.exe

Zaskoczony? Wygląda na to, że instalatory binarne dla systemu Windows utworzone za pomocą distutils łączą pliki .exe z .zip w jeden plik .exe. Zmień rozszerzenie na .zip, aby zobaczyć, że jest to prawidłowy plik ZIP. Odkryłem to po przeczytaniu odpowiedzi na moje pytanie Skąd mogę pobrać binarne jaja za pomocą psycopg2 dla Windows?

AKTUALIZACJA

Jak zauważył Tritium21 w swojej odpowiedzi, obecnie powinieneś używać pip zamiast easy_install. Pip nie może zainstalować pakietów binarnych utworzonych przez distutils, ale może zainstalować pakiety binarne w nowym formacie koła . Możesz przekonwertować stary format na nowy za pomocą pakietu kół , który musisz najpierw zainstalować.

Piotr Dobrogost
źródło
2
Zgadzam się, to jest świetne. Nawiasem mówiąc, jeśli masz 7zip, możesz bezpośrednio otworzyć plik .exe, bez konieczności zmiany jego nazwy na zip.
Sabuncu
5
tylko wskazówka: programiści mogą pobrać różne wbudowane pakiety Pythona dla systemu Windows z lfd.uci.edu/~gohlke/pythonlibs .
Yangzh
@CodyHatch Możesz, ponieważ nie jest to moja jedyna odpowiedź na SO i jest szansa, że ​​niektóre z moich innych odpowiedzi również byłyby pomocne :)
Piotr Dobrogost
1
Otrzymuję następujące informacje: Wyszukiwanie pliku binary-installer-built-with-distutils.exe Czytanie pypi.python.org/simple/ ... Czytanie pypi.python.org/simple/ ... Nie można znaleźć strony indeksu dla „binary_installer_built_with_distutils.exe” Skanowanie indeksu wszystkich pakietów (może to chwilę potrwać) Czytanie pypi.python.org/simple Nie znaleziono pakietów lokalnych ani linków do pobrania dla błędu binary-installer-built-with-distutils.exe: Nie można znaleźć odpowiedniej dystrybucji dla Requirement.parse ('binary-instal ler-built-with-d ...
Paul
1
Paul, exe, do którego się odnosi, będzie się różnić w zależności od używanego instalatora ... a nie dosłownie „binary-installer-built-with-distutils.exe”
Tristan Reid
70

Wiem, że jest to dość stare pytanie, które poprzedza narzędzia, o których będę mówić, ale dla dobra Google myślę, że warto o tym wspomnieć. easy_install to czarna owca w pakiecie Pythona. Nikt nie chce się przyznać, że używa go z nowym gorącym pipem. Ponadto, podczas wykonywania sztuczek rejestru najlepiej działa w przypadku niestandardowych instalatorów EXE (ktoś sam zbudował instalator zamiast używać distutils i sprawdza rejestr w poszukiwaniu ścieżki instalacji), istnieje teraz Better Way (c) dla standardowych instalatorów EXE .

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

Format koła, wprowadzony niedawno w tym poście, jest zamiennikiem formatu jaja, pełniąc prawie taką samą rolę. Ten format jest również obsługiwany przez pip (narzędzie już zainstalowane w twoim virtualenv).

jeśli z jakiegoś powodu pip install WHEELFILEnie działa, spróbujwheel install WHEELFILE

Tryt21
źródło
Dzięki za to. Miejmy nadzieję, że więcej osób zauważy Twoją odpowiedź i zagłosuje za nią!
Brett Stottlemyer,
Żeby było jasne. Możesz utworzyć plik .whl z pliku .exe, na przykład z lfd.uci.edu/~gohlke/pythonlibs . To jest OGROMNY im warunki wdrożenia!
Jonas Gröger,
Próbowałem to zrobić, ale otrzymałem błąd konwersji koła numpy-MKL-1.8.1.win-amd64-py2.7.exe, a następnie pip install numpy-1.8.1-cp27-none-win_amd64.whl Otrzymuję następujący błąd Pobieranie / rozpakowywanie numpy-1.8.1-cp27-none-win-amd64.whl Nie można znaleźć żadnych plików do pobrania spełniających wymaganie numpy-1.8.1-cp27-non e-win-amd64.whl Nie znaleziono żadnych dystrybucji dla numpy -1.8.1-cp27-none-win-amd64.whl
Paul
spróbuj wheel install WHEELFILE, zredagowano odpowiedź, aby wskazać na istnienie tego. Debugowanie konkretnego problemu dla kogoś nie jest czymś trywialnym w komentarzach SO.
Tritium 21
Po tym, jak wiele razy potrzebowałem easy_install tylko w tym celu, było to piękne. * ze łzami w oczach macha na pożegnanie easy_install
KobeJohn,
40

Skończyło się na dostosowaniu skryptu ( http://effbot.org/zone/python-register.htm ), aby zarejestrować instalację Pythona w rejestrze. Mogę odebrać Python być Python w rejestrze, uruchom instalator Windows, a następnie ustawić tyłem rejestru:

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

Uruchom ten skrypt w języku Python, który chcesz zarejestrować, a zostanie on wpisany do rejestru. Pamiętaj, że w systemie Windows 7 i Vista będziesz potrzebować uprawnień administratora.

Ned Batchelder
źródło
1
W systemie Windows 7, 64-bitowym, z 64-bitowym Pythonem musiałem zmienić regpath naregpath = "SOFTWARE\\Wow6432Node\\Python\\Pythoncore\\%s\\" % (version)
Oleksiy
Właściwie dla mojego systemu Windows 7, 64-bitowego, zostawiłem regpath bez zmian i zadziałało. Sugerowany przez @Oleksiy mod nie zadziałał. Prawdopodobnie subtelnie różni się w naszej wersji systemu operacyjnego lub w jakimś ustawieniu.
Paul
Rozwiązanie @Ned Batchelder było jedynym, które działało dla mnie. Instalacja koła nie działała. Nadal otrzymywałem błędy podczas pobierania pakietu (więcej szczegółów w moim komentarzu do tej odpowiedzi). Sugestia uruchomienia easy_install binary_installer ... mogła zadziałać, ale nie udało mi się uzyskać easy_install, aby znaleźć plik binary_installer ... exe.
Paul
7

easy_install może instalować pakiety .exe, o ile zostały one zbudowane przy użyciu celu bdist_wininst firmy distutils, który obejmuje wiele popularnych pakietów. Jednak jest wiele innych, które nie są (wxPython to taki, z którym się zmagałem)

Simon King
źródło
Tak, i pod warunkiem, że zainstalowałeś dowolny pakiet programistyczny wszystkich zależności. W moim przypadku pycuda potrzebuje Boost i CUDA, a nie trywialnego przedsięwzięcia.
Ned Batchelder
1
@Ned Batchelder Tak, i pod warunkiem, że zainstalowałeś dowolny pakiet deweloperski wszystkich zależności. Cóż, instalator binarny też nie instaluje wszystkich zależności, prawda?
Piotr Dobrogost
0

Aby zainstalować PyCUDA, możesz skorzystać ze środowiska easy_install.

dev-env-path/bin/easy_install pycuda

da ci tę samą wersję 0.94rc.

W systemie Windows plik easy_install.exe będzie znajdować się w katalogu Scripts.

po prostu ostry
źródło
1
Niestety, spróbuje to zbudować ze źródła. Miałem nadzieję, że użyję gotowych plików binarnych.
Ned Batchelder
0

Jeśli tak .msi, możesz określić opcje wiersza poleceń za pomocą msiexec. Sam instalator Pythona na to pozwala TARGETDIR, ale nie jestem pewien, czy distutils umieści to w instalatorach dystrybucji.

Jeśli używasz .exe, nie sądzę, aby istniał czysty sposób. Jedną z opcji jest użycie programu takiego jak 7Zip (lub winzip itp.), Aby bezpośrednio wyodrębnić zawartość exe, a następnie skopiować odpowiednie foldery do folderu pakietów witryn wirtualnych. Na przykład, jeśli wyodrębnię plik „processing-0.5.2.win32-py2.5.exe”, znajdę folder „PLATLIB \ processing”, który kopiuję na ścieżkę virtualenv i używam go bez żadnych problemów z uruchomieniem. (Nie jestem pewien, czy to zawsze jest takie proste.)

ars
źródło