Могу ли я установить пакеты Windows Python в virtualenvs?

125

Virtualenv великолепен: он позволяет мне хранить несколько отдельных установок Python, чтобы зависимости разных проектов не были собраны вместе в общую кучу.

Но если я хочу установить пакет в Windows, который упакован как установщик .exe, как я могу направить его для установки в virtualenv? Например, у меня есть pycuda-0.94rc.win32-py2.6.exe. Когда я запускаю его, он проверяет реестр и находит только один Python26 для установки, общий, на котором основан мой virtualenv.

Как я могу направить его на установку в virtualenv?

Нед Батчелдер
источник
1
ответ ниже работает для меня stackoverflow.com/questions/6114115/…
user1960422

Ответы:

201

Да, ты можешь. Все, что тебе нужно

easy_install binary_installer_built_with_distutils.exe

Удивлены? Похоже, двоичные установщики для Windows, созданные с помощью distutils, объединяют .exe с .zip в один файл .exe. Измените расширение на .zip, чтобы убедиться, что это действительный zip-файл. Я обнаружил это после прочтения ответов на свой вопрос. Где я могу скачать двоичные яйца с помощью psycopg2 для Windows?

ОБНОВИТЬ

Как отметил Tritium21 в своем ответе, в настоящее время вы должны использовать pip вместо easy_install. Pip не может устанавливать двоичные пакеты, созданные distutils, но он может устанавливать двоичные пакеты в новом формате wheel . Вы можете конвертировать из старого формата в новый, используя пакет wheel , который вам нужно сначала установить.

Петр Доброгост
источник
2
Согласен, это здорово. Кстати, если у вас 7zip, вы можете открыть .exe напрямую, без необходимости переименовывать его в zip.
Sabuncu
5
просто совет: разработчики могут загружать различные встроенные пакеты python для Windows с lfd.uci.edu/~gohlke/pythonlibs .
yangzh 07
@CodyHatch Вы можете, так как это не единственный мой ответ на SO, и есть шанс, что некоторые из моих других ответов также будут вам полезны :)
Петр Доброгост,
1
Я получаю следующее: Поиск двоичного установщика, созданного с помощью distutils.exe Чтение pypi.python.org/simple/… Чтение pypi.python.org/simple/… Не удалось найти страницу индекса для 'binary_installer_built_with_distutils.exe' Индекс сканирования всех пакетов (это может занять некоторое время) Чтение pypi.python.org/simple Не найдены локальные пакеты или ссылки для загрузки для двоичного установщика-встроенного с-distutils.exe ошибка: не удалось найти подходящий дистрибутив для Requirement.parse ('binary-instal ler-built-with-d ...
Пол
1
Пол, exe, о котором он говорит, будет отличаться в зависимости от того, какой установщик вы используете ... не буквально "двоичный-установщик-встроенный с-distutils.exe"
Тристан Рид
70

Я знаю, что это довольно старый вопрос, и он появился еще до тех инструментов, о которых я собираюсь говорить, но ради Google, я думаю, что было бы неплохо упомянуть об этом. easy_install - это черная овца упаковки Python. Никто не хочет признавать, что использовал его с новой популярностью. Кроме того, хотя трюки с реестром лучше всего подходят для нестандартных установщиков EXE (кто-то сам построил установщик вместо использования distutils и проверяет реестр на предмет пути установки), теперь есть лучший способ (c) для стандартных установщиков EXE ,

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

Формат колеса, представленный недавно в этой публикации, является заменой формата яйца, выполняя почти ту же роль. Этот формат также поддерживается pip (инструмент, уже установленный в вашем virtualenv).

если по каким-то причинам pip install WHEELFILEне работает, попробуйтеwheel install WHEELFILE

Tritium21
источник
Спасибо за это. Надеюсь, больше людей заметят ваш ответ и проголосуют за!
Бретт Стоттлмайер
Чтобы было ясно. Вы можете создать .whl из .exe, например, из lfd.uci.edu/~gohlke/pythonlibs , с этим. Это ОГРОМНЫЕ сроки развертывания!
Йонас Грёгер
Я попытался сделать это, но получил ошибку wheel convert numpy-MKL-1.8.1.win-amd64-py2.7.exe, затем pip install numpy-1.8.1-cp27-none-win_amd64.whl, я получаю следующую ошибку Загрузка / распаковка numpy-1.8.1-cp27-none-win-amd64.whl Не удалось найти загрузки, удовлетворяющие требованию numpy-1.8.1-cp27-non e-win-amd64.whl Для numpy не найдено ни одного дистрибутива -1.8.1-cp27-none-win-amd64.whl
Пол,
попробуйте wheel install WHEELFILE, ответ отредактирован, чтобы указать на существование этого. Отладка конкретной проблемы для кого-то не является чем-то тривиальным в комментариях SO.
Tritium21 09
После того, как easy_install требовался столько раз только для этой цели, это было прекрасно. * со слезами на глазах машет
рукой
40

В итоге я адаптировал сценарий ( http://effbot.org/zone/python-register.htm ) для регистрации установки Python в реестре. Я могу выбрать Python в качестве Python в реестре, запустить установщик Windows, а затем вернуть реестр:

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

Запустите этот скрипт с Python, который вы хотите зарегистрировать, и он будет внесен в реестр. Обратите внимание, что в Windows 7 и Vista вам потребуются права администратора.

Нед Батчелдер
источник
1
В Windows 7, 64 бит, с 64 бит Python пришлось изменить regpath наregpath = "SOFTWARE\\Wow6432Node\\Python\\Pythoncore\\%s\\" % (version)
Алексей
На самом деле для моих 64-битных Windows 7 я оставил regpath как есть, и он работал. Мод, предложенный @Oleksiy, не работал. Возможно, какие-то тонкие отличия в нашей версии ОС или какие-то настройки.
Пол
Решение @Ned Batchelder было единственным, которое сработало для меня. Установка колеса не прошла. Я по-прежнему получаю ошибки при загрузке пакетов (подробнее см. Мой комментарий к этому ответу). Предложение выполнить easy_install binary_installer ... могло сработать, но мне не удалось получить easy_install для поиска файла binary_installer ... exe.
Пол
7

easy_install может устанавливать пакеты .exe, если они были собраны с использованием цели distutils bdist_wininst, которая охватывает многие популярные пакеты. Однако есть много других, которых нет (wxPython - это тот, с которым я боролся)

Саймон Кинг
источник
Да, и при условии, что вы установили любой пакет разработки со всеми зависимостями. В моем случае pycuda нуждается в Boost и CUDA, а это нетривиальная задача.
Ned Batchelder
1
@Ned Batchelder: Да, при условии, что вы установили любой пакет разработки со всеми зависимостями. Ну, бинарный установщик тоже не устанавливает всех зависимостей, не так ли?
Петр Доброгост
0

Вы можете использовать easy_install среды для установки PyCUDA.

dev-env-path/bin/easy_install pycuda

он даст вам ту же версию 0.94rc.

В Windows easy_install.exe будет находиться в каталоге сценариев.

simplyharsh
источник
1
К сожалению, это будет попытка собрать из исходников. Я надеялся использовать готовые двоичные файлы.
Нед Батчелдер
0

Если это .msi, вы можете указать параметры командной строки, используя msiexec. Сам установщик Python позволяет TARGETDIR, но я не уверен, что distutils запекает это в установщиках дистрибутива.

Если вы используете .exe, я не думаю, что есть чистый способ. Один из вариантов - использовать такую ​​программу, как 7Zip (или winzip и т. Д.), Чтобы напрямую извлечь содержимое exe, а затем скопировать соответствующие папки в папку виртуальных пакетов сайта. Например, если я извлекаю «processing-0.5.2.win32-py2.5.exe», я нахожу папку «PLATLIB \ processing», которую копирую по пути virtualenv и использую без каких-либо проблем во время выполнения. (Я не уверен, что это всегда так просто.)

АРС
источник