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

Posted

技术标签:

【中文标题】我可以将 Python windows 包安装到 virtualenvs 中吗?【英文标题】:Can I install Python windows packages into virtualenvs? 【发布时间】:2011-03-17 08:11:57 【问题描述】:

Virtualenv 很棒:它让我可以保留许多不同的 Python 安装,这样不同项目的依赖项就不会全部放在一起。

但是,如果我想在 Windows 上安装一个打包为 .exe 安装程序的包,我该如何引导它安装到 virtualenv 中?例如,我有 pycuda-0.94rc.win32-py2.6.exe。当我运行它时,它会检查注册表,发现只有一个 Python26 可以安装到,这是我的 virtualenv 所基于的常见的那个。

如何引导它安装到 virtualenv 中?

【问题讨论】:

下面的答案对我有用***.com/questions/6114115/… 【参考方案1】:

是的,你可以。你只需要

easy_install binary_installer_built_with_distutils.exe

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

后发现了这一点

更新

正如 Tritium21 在他现在的回答中指出的那样,您应该使用 pip 而不是 easy_install。 Pip 无法安装 distutils 创建的二进制包,但它可以安装新的wheel 格式的二进制包。您可以使用 wheel 包从旧格式转换为新格式,您必须先安装它。

【讨论】:

我同意,这很棒。对了,如果你有7zip的话,可以直接打开.exe,不用重命名为zip。 提示:开发者可以从lfd.uci.edu/~gohlke/pythonlibs 下载各种构建的windows python 包。 @CodyHatch 您可以,因为这不是我对 SO 的唯一答案,而且我的其他一些答案也有可能对您有所帮助:) 我得到以下信息: Searching for binary-installer-built-with-distutils.exe Reading pypi.python.org/simple/… Reading pypi.python.org/simple/… Couldn't find index page for 'binary_installer_built_with_distutils.exe' 扫描所有索引包(这可能需要一段时间)阅读pypi.python.org/simple没有找到二进制安装程序内置的本地包或下载链接错误:找不到Requirement.parse的合适分发('binary-instal ler-built -with-d... Paul,他所指的 exe 会根据您使用的安装程序而有所不同...而不是字面意义上的“binary-installer-built-with-distutils.exe”【参考方案2】:

我知道这是一个相当古老的问题,并且早于我将要讨论的工具,但为了 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

【讨论】:

谢谢。希望更多人注意到您的回答并点赞! 要清楚。您可以使用此从 .exe(例如 lfd.uci.edu/~gohlke/pythonlibs)创建 .whl。这是巨大的部署条款! 我试图这样做,但得到一个错误*** 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 cmets 中为某人调试特定问题并非易事。 只为了这个目的而需要easy_install这么多次之后,那真是太棒了。 *含泪挥手告别easy_install【参考方案3】:

我最终调整了一个脚本 (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 上,您需要管理员权限。

【讨论】:

在 Windows 7 上,64 位,64 位 Python 必须将 regpath 修改为 regpath = "SOFTWARE\\Wow6432Node\\Python\\Pythoncore\\%s\\" % (version) 实际上对于我的 windows 7 64 位,我保留了 regpath 并且它工作正常。 @Oleksiy 建议的 mod 不起作用。可能在我们的操作系统版本或某些设置中有一些细微的不同。 @Ned Batchelder 的解决方案是唯一对我有用的解决方案。车轮安装不起作用。我仍然收到包下载错误(有关详细信息,请参阅我对该答案的评论)。执行 easy_install binary_installer... 的建议可能有效,但我无法让 easy_install 找到 binary_installer...exe 文件。【参考方案4】:

easy_install 能够安装 .exe 包,只要它们是使用 distutils 的 bdist_wininst 目标构建的,它涵盖了许多流行的包。但是,还有很多其他的不是(wxPython 是我一直在努力解决的问题)

【讨论】:

是的,只要您安装了所有依赖项的任何开发包。就我而言,pycuda 需要 Boost 和 CUDA,这不是一件小事。 @Ned Batchelder 是的,只要你安装了所有依赖项的任何开发包。好吧,二进制安装程序也不会安装所有依赖项,不是吗?【参考方案5】:

您可以使用环境的easy_install来安装PyCUDA。

dev-env-path/bin/easy_install pycuda

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

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

【讨论】:

不幸的是,这将尝试从源代码构建。我希望使用预先构建的二进制文件。【参考方案6】:

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

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

【讨论】:

以上是关于我可以将 Python windows 包安装到 virtualenvs 中吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在windows下安装Python(Python入门教程)

如何在 Windows 上安装 Python 包?

使用Windows 10将Python包上传到Pypi的问题 - twine不被认为是内部或外部的推荐

在Windows和Python上运行TensorFlow包失败

如何在Windows上安装Python包?

将包添加到适用于 Windows 的 Python“嵌入式”安装