代码之家  ›  专栏  ›  技术社区  ›  Ned Batchelder

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

  •  124
  • Ned Batchelder  · 技术社区  · 14 年前

    virtualenv非常棒:它让我保留了许多不同的python安装,这样不同项目的依赖关系就不会全部被扔到一个公共堆中。

    但是,如果我想在Windows上安装一个打包为.exe安装程序的包,我该如何引导它安装到virtualenv中呢?例如,我有pycuda-0.94rc.win32-py2.6.exe。当我运行它时,它检查注册表,只找到一个要安装的python26,这是我的virtualenv所基于的公共python26。

    如何引导它安装到virtualenv中?

    6 回复  |  直到 9 年前
        1
  •  200
  •   Community CDub    8 年前

    是的,你可以。你所需要的只是

    简易安装 二进制安装程序用distutils.exe构建

    惊讶?它看起来像是用distutils制作的用于Windows的二进制安装程序将.exe和.zip合并到一个.exe文件中。将扩展名改为.zip以查看它是有效的zip文件。我在读了我问题的答案后发现了这个 Where can I download binary eggs with psycopg2 for Windows?

    更新

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

        2
  •  70
  •   Tritium21 e221a3c800    11 年前

    我知道这是一个很古老的问题,早于我将要讨论的工具,但是为了谷歌,我认为提到它是个好主意。易安装是巨蟒包装的败类。没有人愿意承认使用它与新的热点周围的pip。另外,虽然对非标准的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

        3
  •  40
  •   Ned Batchelder    14 年前

    我最后改了剧本( http://effbot.org/zone/python-register.htm )在注册表中注册python安装。我可以选择巨蟒 这个 python在注册表中,运行Windows Installer,然后重新设置注册表:

    # -*- 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上,您需要管理员权限。

        4
  •  7
  •   Simon King    14 年前

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

        5
  •  0
  •   simplyharsh    14 年前

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

    dev-env-path/bin/easy_install pycuda
    

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

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

        6
  •  0
  •   ars    14 年前

    如果是 .msi ,您可以使用 msiexec . 蟒蛇 installer 本身允许 TARGETDIR 但我不确定distutils是否将其烘焙到分发安装程序中。

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