如何在Snow Leopard上强制使用32位Python以及其他32位/64位问题

37
从我的Mac终端运行以下命令时:
$ file /usr/bin/python

我收到了以下三行代码:

/usr/bin/python (for architecture x86_64):  Mach-O 64-bit executable x86_64
/usr/bin/python (for architecture i386):    Mach-O executable i386
/usr/bin/python (for architecture ppc7400): Mach-O executable ppc

这似乎表明Python已经为所有三种架构编译了或类似的东西?根据我在尝试设置MySQL时遇到的一些错误,我相信我正在使用的版本是64位版本。所以有两个问题:

  1. 我怎么知道呢?

  2. 我如何将Python更改为32位?有没有比重新编译不同的编译设置更小的变化?

  3. 为什么从bash shell中获取的arch返回i386,这似乎表明我不处于“64位模式”,但基于我的处理器,我知道我正在运行64位Mac?

抱歉,这可能都是新手问题,整个32/64位的事情让我非常沮丧,我相信有些命令/工具可以使这更容易。

7个回答

30
  1. 通过platform模块(sys模块也有一些简单的辅助函数),您可以了解有关正在运行的Python版本的很多信息。

  2. 在Mac OS X上,您可以使用以下命令以所选架构运行“fat二进制文件”:

    arch -i386 /usr/bin/python

不建议更改/usr/lib/python本身(使用lipo命令)--通过篡改系统文件,您可能会使系统无法使用。也许在保留系统Python的情况下从python.org安装单独的Python(用于应用程序)是一种可接受的策略-这绝对比更改系统文件更安全!-)

至于您的第三个问题,嗯,这个问题对我来说很难回答-而且与Python完全无关,似乎与编程完全无关;-)。


24
虽然 arch -i386 filename 通常可以正常运行,但在10.6上,arch -i386 /usr/bin/python 仍会以64位模式运行Python(如果可能的话)。建议使用 export VERSIONER_PYTHON_PREFER_32_BIT=yes (参见Apple的 man 1 python),或者使用 arch -i386 /usr/bin/python2.6 - Ned Deily
7
请注意,VERSIONER_PYTHON_PREFER_32_BIT环境变量是苹果提供的Python 2.6在OS X 10.6 (/usr/bin/python)中的一个特性。它不会影响由python.org安装程序安装的其他Python版本。 - Ned Deily
1
大家好,我已经使用Homebrew软件包管理器项目(他们的标语让我笑了,“MacPorts让你喝醉了?试试Homebrew!”)从源代码构建了我的Python发行版。VERSIONER_PYTHON_PREFER_32_BIT对我来说似乎是针对Apply提供的Python的,有没有办法用自定义的Python发行版玩同样的把戏?我不想将'arch -i386 python'别名为python。 - Daniel Farrell
@boyfarrell 我有完全相同的问题。你找到什么诀窍了吗?即使是别名也似乎对我没有用,我无法让我的Django测试服务器使用32位python运行。 - Neil

24

6
可以使用VERSIONER_PYTHON_PREFER_32_BIT环境变量,如man 1 python中所述。这样做,或者这样做可以选择32位Python版本。 - Ned Deily
2
完美。适用于Mac OS X Mavericks 10.9。 - andilabs
谢谢!我已经花了一整天的时间寻找解决方案。 - Cilan

19

修复在Snow Leopard上使用virtualenv的问题

danielrsmith的答案在我不使用virtualenv时能够正常工作,但是virtualenv会复制Python可执行文件,导致它无法正常工作:

$ which python
/Users/cogg/.virtualenvs/tweakeats/bin/python

$ python
[...]
>>> import sys
>>> sys.maxint
9223372036854775807

因为这是Python的一个副本,所以我在它上面使用了lipo来移除64位架构。这使我能够在virtualenv中使用32位Python 2.6:

$ lipo -info /Users/cogg/.virtualenvs/tweakeats/bin/python
Architectures in the fat file: /Users/cogg/.virtualenvs/tweakeats/bin/python are: x86_64 i386 ppc7400
$ mv /Users/cogg/.virtualenvs/tweakeats/bin/python /Users/cogg/.virtualenvs/tweakeats/bin/python.old
$ lipo -remove x86_64 /Users/cogg/.virtualenvs/tweakeats/bin/python.old -output /Users/cogg/.virtualenvs/tweakeats/bin/python
$ python
[...]
>>> import sys
>>> sys.maxint
2147483647

1
谢谢。我失去了psycopg2,试图找到解决方案时几乎哭了出来。 - Jonathan Vanasco
为什么 VE 版本的 Python 不遵守环境变量? - rbp

6
答案已被接受。但我认为第三个问题仍未得到解答。我发现这是一个有趣的问题,因此进行了一些研究。以下是我在另一个SO论坛中找到的答案 -
SnowLeopard 在 32 位 Intel 机器上运行 32 位系统软件和应用程序,在 64 位 Intel 机器上运行 64 位系统软件和 32 位以及 64 位应用程序。Snow Leopard 的桌面版本为了保证 kext 和驱动程序的兼容性而引导了一个 32 位内核,但所有用户空间都运行在 64 位。Mac OS X Server 引导进入 64 位内核。Core 2 Duo 是一台 64 位机器。尝试 $ sysctl hw.cpu64bit_capable 或 sysctl hw.optional.x86_64 来验证您是否拥有 64 位 CPU。arch 命令在 Leopard 和 Snow Leopard 上的 Intel 硬件上始终显示 i386。- cdespinosa Sep 22 '09 at 4:23
原链接 - Mac OSX 10.6 compiler: a puzzling experience with 32 vs 64 bit

0
试了很多次上面的建议后,我自己不断尝试,最终找到了下面这个符号链接:
/usr/local/bin/python2-32

指向:

/Library/Frameworks/Python.framework/Versions/2.7/bin/python2-32

我发现当我运行这个Python程序时,它以32位模式启动(与/Library/Frameworks/Python.framework/Versions/2.7/bin/python2相反)。这可以在活动监视器中观察到。

注意:正如其他人在其他地方指出的那样,platform.architecture()并不总是一个好的指标。它显示这个32位进程为“64位”。


0

我尝试了许多不同的方法来执行Skype4Py测试脚本,包括:

arch -i386

最终有效的方法是查看所声称的64位Python版本的segfault路径,并将其放入我的头文件中: #!/System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python

在我将此行放在顶部并为我的文件添加执行权限后,我可以使用以下命令: arch -i386 skype.py
这样就可以无问题地运行了。

0

第三个问题与32/64位内核有关

仅仅因为你拥有一个64位的操作系统和64位的CPU处理器,并不意味着你在Mac OSX中启动了64位内核

如果你从工厂购买的Mac上安装了10.6雪豹系统,则默认情况下以32位模式运行

你需要编辑系统设置来启动64位模式

(我不确定10.7或10.8的更改情况,因为我使用的最新版本是雪豹,但我相信它们可能会通过出厂默认方式启动64位内核)

10.6-从终端运行以下命令:

 :*sudo nvram boot-args="arch=x86_64"

或者

10.6 - 从终端运行以下命令:

sudo defaults write /Library/Preferences/SystemConfiguration/com.apple.Boot 'Kernel Flags' 'arch=x86_64'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接