我可以在virtualenvs中安装Python windows包吗?

Can I install Python windows packages into virtualenvs?

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文件。在阅读了我的问题答案之后,我发现了这一点:在哪里可以下载带有psycopg2 for Windows的二进制鸡蛋?

更新

正如Tritium21在他的回答中所指出的,现在你应该使用pip而不是简单的安装。pip无法安装distutils创建的二进制软件包,但可以以新的wheel格式安装二进制软件包。您可以使用轮盘包从旧格式转换为新格式,必须先安装轮盘包。


我知道这是一个很古老的问题,早于我将要讨论的工具,但是为了谷歌,我认为提到它是个好主意。易安装是Python包装的败类。没有人愿意承认使用它与新的热点周围的pip。另外,虽然对非标准的exe安装程序(有人自己构建了安装程序,而不是使用distutils,并且正在检查注册表中的安装路径)使用注册表技巧效果最好,但现在有了一种更好的方法(c)来安装标准的exe安装程序。

1
2
3
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安装程序,然后重新设置注册表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# -*- 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运行这个脚本,它将被输入注册表。请注意,在Windows7和Vista上,您需要管理员权限。


轻松安装可以安装.exe包,只要它们是使用distutils的bdist-wininst-target构建的,它涵盖了许多流行的包。然而,还有很多其他的人没有(Wxpython是我一直在努力的一个)


如果是.msi,您可以使用msiexec指定命令行选项。python安装程序本身允许TARGETDIR,但我不确定distutils是否将其烘焙到发行版安装程序中。

如果你用的是.exe,我觉得没有干净的方法。一个选项是使用类似7zip(或winzip等)的程序直接提取exe的内容,然后将相关文件夹复制到虚拟站点包文件夹中。例如,如果我提取"processing-0.5.2.win32-py2.5.exe",我会找到一个文件夹"platlibprocessing",将其复制到virtualenv路径中,使用时不会出现任何运行时问题。(但我不确定事情总是那么简单。)


您可以使用环境的轻松安装来安装pycuda。

1
dev-env-path/bin/easy_install pycuda

它将提供相同版本的0.94rc。

在Windows上,easy_install.exe将位于脚本目录中。