How do I force Python to be 32-bit on Snow Leopard and other 32-bit/64-bit questions

匿名 (未验证) 提交于 2019-12-03 02:11:02

问题:

When I run the following from a bash shell on my Mac:

$ file /usr/bin/python 

I get the following three lines:

/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 

this would seem to indicate that Python has been compiled for all three architectures or something like that? I believe, based on some errors I had while trying to setup MySQL, that the version I'm using is the 64-bit version. So two questions:

  1. How would I have known that?

  2. How could I change Python to be 32-bit instead? Something less drastic than re-compile with different compile settings?

  3. Why does arch from a bash shell return i386 which would seem to indicate I'm not in "64-bit mode" when I know based on my processor I'm running a 64-bit Mac?

Sorry these are probably all newbie questions, the whole 32/64-bit thing is frustrating the crap out of me and I'm sure there are some commands/tools that would make this easier.

回答1:

  1. You can find out a lot about the Python version you're running via the platform module (the sys module also has a few simple helpers)

  2. On Mac OS X, you can run a "fat binary" with your chosen architecture with, for example,

    arch -i386 /usr/bin/python

I do not recommend altering /usr/lib/python itself (with the lipo command) -- you could easily make your system unusable by tampering with system files. Maybe installing a separate Python from python.org (for application purposes) while leaving the system Python alone is an acceptable strategy to you -- it's definitely safer than altering system files!-)

As for your third question, hmmm, this one's a stumper to me -- and definitely a question for superuser.com (as well as completely unrelated to Python, it also seems completely unrelated to programming;-).



回答2:

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



回答3:

Fix for use with virtualenv on Snow Leopard

danielrsmith's answer works for me when I am not using virtualenv, but virtualenv makes a copy of the python executable which causes it not to work:

$ which python /Users/cogg/.virtualenvs/tweakeats/bin/python  $ python [...] >>> import sys >>> sys.maxint 9223372036854775807 

because this is a copy of python, I used lipo on it to remove the 64-bit architecture. This allows me to use 32-bit python 2.6 with virtualenv:

$ 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 


回答4:

The answer has been accepted. But I think the 3rd question is still unanswered. I found it to be an interesting question and so did some research for the same. Here is the answer I found in another SO forum -

Original link - Mac OSX 10.6 compiler: a puzzling experience with 32 vs 64 bit



回答5:

the third question has to do with the 32 / 64 bit kernel

just because you have a 64 bit capable OS and 64 bit capable CPU processor does not mean you are booting up a 64 bit kernel in Mac OSX

If you got a Mac with 10.6 snow leopard on it from the factory, then it shipped in 32 bit mode by default

you would have to edit the system setting to boot 64 bit mode

(not sure on changes to 10.7 or 10.8 as the latest I use is snow leo but I believe they may boot 64 bit kernel by factory-default)

10.6 - from terminal run the command:

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

OR

10.6 - from terminal run the command:

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


回答6:

I tried many different ways of executing the Skype4Py test script using,

arch -i386 

What worked in the end was looking at the segfault path for the claimed 64-bit version of python and putting that in my header file: #!/System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python

After I put this line at the top and added execute permissions to my file, I could use, arch -i386 skype.py

And it would run without issue.



回答7:

After a huge amount of trial and error myself trying out some of the suggestions above, I stumbled upon the following symlink:

/usr/local/bin/python2-32 

pointing to:

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

And I observe that when I run this Python, it starts in 32-bit mode (in contrast to /Library/Frameworks/Python.framework/Versions/2.7/bin/python2). This can be observed in Activity Monitor.

Note: as others have pointed out elsewhere, platform.architecture() is not always a good indicator. It is showing '64-bit' for this 32-bit process.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!