创建虚拟环境时,Python在OSX中仍然以64位运行,而已设置为32位

2 投票
1 回答
2350 浏览
提问于 2025-04-16 20:56

我的环境设置是:2.6.1 版本的 Python(这是苹果默认的,适用于雪豹系统),我使用了 virtualenv,并且还用了 virtualenvwrapper。

在这个环境外面,一切都在 32 位下运行,这没问题。但是我有一个新项目需要用到 Django 1.3 和很多依赖,所以我创建了一个 virtualenv。

我已经成功安装了所有东西,除了 mysql-python(通过 pip 安装)出现了一个错误,提示“mach -o wrong architecture”。我在 virtualenv 里用“import sys; sys.maxint”检查了我的 Python 解释器,发现它在 64 位下运行。

我已经通过“defaults write com.apple.versioner.python Prefer-32-Bit -bool yes”设置了系统级别的 Python 运行在 32 位。

有没有人知道为什么在 virtualenv 里会出现这个问题?

1 个回答

8

苹果在 OS X 10.6 中实现他们的 Prefer-32-bit 功能时,很多“魔法”都藏在 /usr/bin/python 这个文件里。这个文件会调用真正的 Python 解释器,而这些解释器的快捷方式则放在 /usr/bin/python2.6/usr/bin/python2.5。而 virtualenv 会把真正的解释器复制到虚拟环境的 bin 目录中,这样就可以绕过 Prefer-32-bit 的处理了。

为了确保使用 32 位操作,有以下几种选择:

  1. 使用 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
    
  2. 使用 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
    
  3. 安装并使用更新的仅支持 32 位的 Python 2.6 或 2.7(可以从 python.org 下载安装包)。

撰写回答