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

时间:2010-01-18 19:13:50

标签: python osx-snow-leopard 32bit-64bit

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

  4. 对不起这些可能都是新手问题,整个32/64位的东西让我感到沮丧,我确信有一些命令/工具可以让这更容易。

7 个答案:

答案 0 :(得分:30)

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

  2. 在Mac OS X上,您可以使用所选的架构运行“胖二进制”,例如

    arch -i386 / usr / bin / python

  3. 建议更改/ usr / lib / python本身(使用lipo命令) - 您可以通过篡改系统文件轻松使系统无法使用。也许从python.org安装一个单独的Python(用于应用程序)而单独留下系统Python对你来说是一个可接受的策略 - 它肯定比改变系统文件更安全! - )

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

答案 1 :(得分:24)

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

答案 2 :(得分:19)

修复与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

答案 3 :(得分:6)

答案已被接受。但我认为第三个问题仍然没有答案。我发现它是一个有趣的问题,所以也做了一些研究。以下是我在另一个SO论坛中找到的答案 -

  

SnowLeopard在32位Intel机器上运行32位系统软件和应用程序,在64位Intel机器上运行64位系统软件和32位和64位应用程序。由于kext和驱动程序兼容性,Snow Leopard的桌面版本引导了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的英特尔硬件上显示i386。 - cdespinosa 09年9月22日4:23

原始链接 - Mac OSX 10.6 compiler: a puzzling experience with 32 vs 64 bit

答案 4 :(得分: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"

OR

10.6 - 从终端运行命令:

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

答案 5 :(得分:0)

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

arch -i386

最终有效的是查看声称的64位python版本的段错误路径,并将其放在我的头文件中:     #!/系统/资源库/框架/ Python.framework /版本/ 2.7 /资源/ Python.app /内容/ MacOS的/ Python的

将此行放在顶部并为我的文件添加执行权限后,我可以使用,     arch -i386 skype.py

它会毫无问题地运行。

答案 6 :(得分: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相反)。这可以在Activity Monitor中观察到。

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

相关问题