如何强制Python在Snow Leopard和其他32位/ 64位问题上是32位的

当我从Mac上的bash shell运行以下代码时:

$ 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. 为什么arch从一个bash shell返回i386这似乎表明我不是在“64位模式”,当我知道基于我的处理器我正在运行一个64位的Mac?

对不起,这些可能都是新手的问题,整个32/64位的东西让我感到沮丧,我敢肯定有一些命令/工具可以使这个更简单。

  1. 您可以通过platform模块find很多关于您正在运行的Python版本( sys模块也有一些简单的帮助器)

  2. 在Mac OS X上,您可以使用您select的体系结构运行“胖二进制”,例如,

    arch -i386 / usr / bin / python

build议修改/ usr / lib / python本身(使用lipo命令) – 通过篡改系统文件,可能会使系统变得无法使用。 也许从python.org(为了应用程序的目的)安装一个单独的Python,同时让系统的Python单独是一个可以接受的策略 – 它肯定比修改系统文件更安全!)

至于你的第三个问题,嗯,这对我来说是一个挑战 – 对于superuser.com来说绝对是一个问题(与Python完全无关,它似乎也完全与编程无关;-)。

http://www.jaharmi.com/2009/08/29/python_32_bit_execution_on_snow_leopard

$ defaults write com.apple.versioner.python Prefer-32-Bit -bool yes

修复与Snow Leopard上的virtualenv一起使用

当我不使用virtualenv时,danielrsmith的答案适用于我,但是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 

答案已被接受。 但是我觉得第三个问题还没有答案。 我发现这是一个有趣的问题,所以也做了一些相同的研究。 这是我在另一个SO论坛发现的答案 –

SnowLeopard在32位英特尔机器上运行32位系统软件和应用程序,在64位英特尔机器上运行64位系统软件和32位和64位应用程序。 由于kext和驱动程序的兼容性,Snow Leopard的桌面版引导了32位内核,但所有用户空间都运行64位。 Mac OS X Server启动到64位内核。 酷睿2是一个64位的机器。 试试$ sysctl hw.cpu64bit_capable或者sysctl hw.optional.x86_64来validation你是否有一个64位的cpu。 Arch总是会在Leopard和Snow Leopard中的Intel硬件上显示i386。 – – cdespinosa 09年9月22日在4:23

原始链接 – Mac OSX 10.6编译器:32位和64位的令人费解的体验

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

只是因为你有一个64位能力的操作系统和64位CPU处理器并不意味着你正在启动一个64位内核在Mac OSX

如果你有一个10.6的雪豹从工厂出厂,那么它默认以32位模式发货

您将不得不编辑系统设置以启动64位模式

(不知道对10.7或10.8的更改,因为我使用的最新版本是snow leo,但我相信它们可能会在出厂默认情况下启动64位内核)

10.6 – 从terminal运行命令:

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

要么

10.6 – 从terminal运行命令:

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

我尝试了许多不同的方法来执行Skype4Pytesting脚本,

 arch -i386 

最后看到的是声明的64位版本的Python的段错误path,并将其放在我的头文件中:#!/ System / Library / Frameworks / Python.framework / Versions / 2.7 / Resources / Python.app /内容/ MacOS的/ Python的

在我把这一行放在最上面,并将执行权限添加到我的文件后,我可以使用arch -i386 skype.py

它会运行没有问题。

经过大量的试验和错误,我自己尝试了上面的一些build议,我偶然发现了以下的符号链接:

 /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位”。