Virtualenv 很棒:它让我可以保留许多不同的 Python 安装,这样不同项目的依赖项就不会全部放在一起。
但是,如果我想在 Windows 上安装一个打包为 .exe 安装程序的包,我该如何引导它安装到 virtualenv 中?例如,我有 pycuda-0.94rc.win32-py2.6.exe。当我运行它时,它会检查注册表,并且只找到一个要安装的 Python26,这是我的 virtualenv 所基于的常见 Python26。
如何指导它安装到 virtualenv 中?
Virtualenv 很棒:它让我可以保留许多不同的 Python 安装,这样不同项目的依赖项就不会全部放在一起。
但是,如果我想在 Windows 上安装一个打包为 .exe 安装程序的包,我该如何引导它安装到 virtualenv 中?例如,我有 pycuda-0.94rc.win32-py2.6.exe。当我运行它时,它会检查注册表,并且只找到一个要安装的 Python26,这是我的 virtualenv 所基于的常见 Python26。
如何指导它安装到 virtualenv 中?
是的你可以。所有你需要的是
easy_install binary_installer_built_with_distutils.exe
惊讶吗?看起来像使用 distutils 制作的 Windows 二进制安装程序将 .exe 和 .zip 合并到一个 .exe 文件中。将扩展名更改为 .zip 以查看它是有效的 zip 文件。在阅读了我的问题的答案后,我发现了这一点,我在哪里可以使用 Windows 的 psycopg2 下载二进制鸡蛋?
更新
正如 Tritium21 在他现在的回答中指出的那样,您应该使用 pip 而不是 easy_install。Pip 无法安装 distutils 创建的二进制包,但它可以安装新的wheel格式的二进制包。您可以使用必须先安装的wheel包从旧格式转换为新格式。
我知道这是一个相当古老的问题,并且早于我将要讨论的工具,但为了 Google,我认为提及它是个好主意。easy_install 是 python 打包的害群之马。没有人愿意承认将它与 pip 的新热点一起使用。此外,虽然玩注册表技巧对非标准 EXE 安装程序最有效(有人自己构建了安装程序,而不是使用 distutils,并且正在检查注册表中的安装路径),但现在标准 EXE 安装程序有更好的方式(c) .
pip install wheel
wheel convert INSTALLER.EXE
pip install NEW_FILE_CREATED_IN_LAST_STEP.whl
最近在这篇文章中引入的轮格式是鸡蛋格式的替代品,其作用大致相同。pip(一个已经安装在你的 virtualenv 中的工具)也支持这种格式。
如果由于某种原因pip install WHEELFILE
不起作用,请尝试wheel install WHEELFILE
我最终调整了一个脚本 ( 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 上,您需要管理员权限。
easy_install 能够安装 .exe 包,只要它们是使用 distutils 的 bdist_wininst 目标构建的,它涵盖了许多流行的包。但是,还有很多其他的不是(wxPython 是我一直在努力解决的问题)
您可以使用环境的 easy_install 来安装 PyCUDA。
dev-env-path/bin/easy_install pycuda
它将为您提供相同的 0.94rc 版本。
在 Windows 上,easy_install.exe 将位于 Scripts 目录中。
如果它是.msi
,您也许可以使用msiexec
. Python安装程序本身允许TARGETDIR
,但我不确定 distutils 是否将其烘焙到分发安装程序中。
如果您使用的是.exe
,我认为没有干净的方法。一种选择是使用 7Zip(或 winzip 等)之类的程序直接提取 exe 的内容,然后将相关文件夹复制到您的虚拟站点包文件夹中。例如,如果我提取“processing-0.5.2.win32-py2.5.exe”,我会找到一个文件夹“PLATLIB\processing”,我将其复制到 virtualenv 路径并使用,不会出现任何运行时问题。(我不确定它总是那么简单。)