2010-07-17 3 views
123

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

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

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

+1

Ответ на этот вопрос ниже работы для меня http://stackoverflow.com/questions/6114115/windows-virtualenv-pip-numpy-problems-when- install-numpy – user1960422

ответ

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 вам понадобятся права администратора.

+2

Это замечательно; спасибо за обмен с сообществом. – Profane

+1

В Windows 7, 64 бит, с 64-битным Python пришлось модифицировать regpath для 'regpath = 'SOFTWARE \\ Wow6432Node \\ Python \\ Pythoncore \\% s \\"% (версия) ' – Oleksiy

+0

Фактически для моих окон 7, 64 бит, я оставил regpath как есть, и он сработал. Мод @ Олексий предложил не сработать. Возможно, некоторые тонкие отличия в нашей версии ОС или некоторые настройки. – Paul

0

Чтобы установить PyCUDA, вы можете использовать easy_install среды.

dev-env-path/bin/easy_install pycuda 

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

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

+1

К сожалению, это попытается построить из источника. Я надеялся использовать предварительно созданные двоичные файлы. –

0

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

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

7

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

+0

Да, и до тех пор, пока вы установили какой-либо пакет разработки всех зависимостей. В моем случае pycuda нуждается в Boost и CUDA, а не в тривиальной задаче. –

+1

@Ned Batchelder * Да и до тех пор, пока вы установили какой-либо пакет разработки всех зависимостей. * Ну, двоичный установщик также не устанавливает все зависимости, не так ли? –

197

Да, вы можете. Все, что вам нужно, это

easy_install binary_installer_built_with_distutils.exe

Удивленный? Похоже, двоичные установщики для Windows, сделанные с distutils, объединяют .exe с .zip в один файл .exe. Измените расширение на .zip, чтобы увидеть, что это действительный zip-файл. Я обнаружил это после прочтения ответов на мой вопрос Where can I download binary eggs with psycopg2 for Windows?

UPDATE

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

+14

Это фантастика. Хотел бы я проголосовать за вас не один раз. –

+2

Согласен, это здорово. Кстати, если у вас есть 7zip, вы можете открыть .exe напрямую, не переименовывая его как zip. – Sabuncu

+5

просто совет: разработчики могут загружать различные встроенные пакеты python для окон из http://www.lfd.uci.edu/~gohlke/pythonlibs/. – yangzh

68

Я знаю, что это довольно старый вопрос и предшествует инструментам, о которых я собираюсь поговорить, но ради 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

+0

Спасибо. Надеемся, что больше людей заметят ваш ответ и возвышение! –

+0

Быть ясным. Вы можете создать .whl из .exe, например, из http://www.lfd.uci.edu/~gohlke/pythonlibs/, с этим. Это ОГРОМНЫЕ условия развертывания! –

+0

Я попытался это сделать, но получил колесо ошибки конвертирования 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 – Paul