【问题标题】:How do I force Python to be 32-bit on Snow Leopard and other 32-bit/64-bit questions如何在 Snow Leopard 和其他 32 位/64 位问题上强制 Python 为 32 位
【发布时间】:2011-01-06 12:15:10
【问题描述】:

当我从 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. 1234563 Mac?

抱歉,这些可能都是新手问题,整个 32/64 位的东西让我很沮丧,我确信有一些命令/工具可以让这更容易。

【问题讨论】:

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


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

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

      arch -i386 /usr/bin/python

    我确实建议更改 /usr/lib/python 本身(使用lipo 命令)——您可以通过篡改系统文件轻松使您的系统无法使用。也许从 python.org 安装一个单独的 Python(出于应用程序目的),而让系统 Python 单独运行对您来说是一种可以接受的策略——这绝对比更改系统文件更安全!-)

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

    【讨论】:

    • 虽然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
    • 请注意,VERSIONER_PYTHON_PREFER_32_BIT 环境变量是 Apple 在 OS X 10.6 (/usr/bin/python) 中提供的 Python 2.6 的一项功能。它对其他 Python 没有影响,例如由 python.org 安装程序安装的那些。
    • 大家好,我已经使用 Homebrew 包管理器项目从源代码构建了我的 python 发行版(他们的标语让人发笑,“MacPorts 让你喝酒?试试 Homebrew!”)。 VERSIONER_PYTHON_PREFER_32_BIT 在我看来适用于应用提供的 python,是否有与自定义 python 发行版相同的技巧?我真的不想将'arch -i386 python'别名为python。
    • @boyfarrell 我也有同样的问题。你有没有找到诀窍?即使别名似乎对我不起作用,我无法让我的 Django 测试服务器使用 32 位 python 运行
    【解决方案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

    【讨论】:

    • 那个,或者使用man 1 python中描述的VERSIONER_PYTHON_PREFER_32_BIT环境变量。
    • 完美。适用于 Mac OS X Mavericks 10.9
    • 谢谢!我整天都在寻找解决方案。
    【解决方案3】:

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

    当我不使用 virtualenv 时,danielrsmith 的回答对我有用,但是 virtualenv 会复制 python 可执行文件,导致它无法工作:

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

    因为这是python的副本,所以我在上面使用了lipo来移除64位架构。这允许我将 32 位 python 2.6 与 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
    

    【讨论】:

    • 谢谢。在失去 psycopg2 后,我几乎要流泪了。
    • 为什么python的VE副本不尊重环境变量?
    【解决方案4】:

    答案已被接受。但我认为第三个问题仍然没有答案。我发现这是一个有趣的问题,因此也做了一些研究。这是我在另一个 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 的 Intel 硬件上显示 i386。 – cdespinosa 2009 年 9 月 22 日 4:23

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

    【讨论】:

      【解决方案5】:

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

      仅仅因为您拥有支持 64 位的操作系统和支持 64 位的 CPU 处理器,并不意味着您正在 Mac OSX 中启动 64 位内核

      如果你的 Mac 出厂时带有 10.6 雪豹,那么它出厂时默认为 32 位模式

      您必须编辑系统设置以启动 64 位模式

      (不确定对 10.7 或 10.8 的更改,因为我使用的最新版本是 snow leo,但我相信它们可能会在出厂默认情况下启动 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'
      

      【讨论】:

        【解决方案6】:

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

        arch -i386
        

        最终起作用的是查看声称的 64 位版本 python 的段错误路径并将其放入我的头文件中: #!/System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python

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

        它会毫无问题地运行。

        【讨论】:

          【解决方案7】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-10-18
            • 2012-01-07
            • 2012-09-17
            • 2010-12-27
            • 2011-06-26
            • 2021-05-23
            • 2011-12-12
            相关资源
            最近更新 更多