当我创建一个 virtualenv 时,即使在 OSX 中已经设置为 32 位,python 也会以 64 位运行

Posted

技术标签:

【中文标题】当我创建一个 virtualenv 时,即使在 OSX 中已经设置为 32 位,python 也会以 64 位运行【英文标题】:When I create a virtualenv, python runs in 64-bit even when already set to 32-bit in OSX 【发布时间】:2011-09-29 11:44:14 【问题描述】:

我的设置是:2.6.1 python (apple default, snow leopard), virtualenv, and using virtualenvwrapper

在环境之外,一切都以 32 位运行,这很好。但是对于一个新项目,我要处理需要 django 1.3 和大量依赖项,所以我制作了一个 virtualenv。

我已经成功地安装了所有东西,除了 mysql-python(通过 pip)收到“mach -o wrong architecture”的错误。我已经在 virtualenv 中使用“import sys;sys.maxint”检查了我的 python 解释器,并且 python 以 64 位运行。

我已经通过“defaults write com.apple.versioner.python Prefer-32-Bit -bool yes”将系统范围内的 python 设置为 32 位运行

有谁知道为什么会在 virtualenv 中发生这种情况?

【问题讨论】:

【参考方案1】:

Apple 用于在 OS X 10.6 中为系统 Python 实现 Prefer-32-bit 的大部分“魔法”在 /usr/bin/python 中,然后它调用真正的 Python 解释器,这些解释器在 /usr/bin/python2.6/usr/bin/python2.5 处符号链接。 virtualenv 将真正的解释器复制到 virtualenv 的 bin 目录中,从而绕过了 Prefer-32-bit 处理。

在确保 32 位操作的选项中:

    使用arch 命令调用解释器。

    $ virtualenv -p /usr/bin/python2.6 ./p
    $ ./p/bin/python -c 'import sys;print(sys.maxsize)'
    9223372036854775807
    $ arch -i386 ./p/bin/python -c 'import sys;print(sys.maxsize)'
    2147483647
    

    使用lipo 从通用二进制文件中仅提取 32 位拱门。

    $ file ./p/bin/python
    ./p/bin/python: Mach-O universal binary with 3 architectures
    ./p/bin/python (for architecture x86_64):   Mach-O 64-bit executable x86_64
    ./p/bin/python (for architecture i386): Mach-O executable i386
    ./p/bin/python (for architecture ppc7400):  Mach-O executable ppc
    $ cp ./p/bin/python ./p/bin/python-universal
    $ lipo ./p/bin/python-universal -thin i386 -output ./p/bin/python
    $ file ./p/bin/python
    ./p/bin/python: Mach-O executable i386
    $ ./p/bin/python -c 'import sys;print(sys.maxsize)'
    2147483647
    

    安装和使用更新的仅 32 位 Python 2.6 或 2.7(安装程序可从 python.org 获得)

【讨论】:

谢谢。我已经为 virtualenv 中的可执行文件完成了第二个选项(使用 lipo),因为由于某种未知原因,使用 arch 命令在运行 django mini 服务器(arch -i386 python manage.py runserver)时不起作用。 是的,如果您运行的程序通过 subprocess 等产生其他 Python 进程,arch 技巧将不起作用,因此使用 lipo 或仅 32 位 Python 是更安全。

以上是关于当我创建一个 virtualenv 时,即使在 OSX 中已经设置为 32 位,python 也会以 64 位运行的主要内容,如果未能解决你的问题,请参考以下文章

virtualenv -p 创建新虚拟环境时删除 sys.prefix 文件路径的最后一部分

virtualenv 不包括 pip

无法在 virtualenv 中导入 django,但在停用时可以工作

在 openSuSE 中使用带有 python3 的 virtualenv

无法在 Windows 的 GIT bash mingw32 中激活 virtualenv

重命名 virtualenv 文件夹而不破坏它