如何判断Rosetta是否已安装?

4

我正在编写一个Python脚本,它依赖于已安装的rosetta。Rosetta是Mac OS X的动态二进制翻译器,允许许多PowerPC应用程序在某些基于Intel的Macintosh计算机上运行而不需要修改。有没有办法检查操作系统以查看是否存在rosetta


类似Rosetta Stone(学习语言的工具)吗? - Joran Beasley
3
不行。"nope"的意思是拒绝或否认。原文的意思是:Rosetta是Mac OS X上的动态二进制翻译器,它允许许多PowerPC应用程序在某些基于Intel的Macintosh计算机上无需修改即可运行。 - Mizmor
你能在Python中运行“which rosetta”,并检查是否有返回值吗?这样不就能确定它是否已安装了吗? - Tyler Ferraro
Maria Zverina的解决方案可能是最好的。我能想到的唯一替代方案是,如果操作系统<10.7且CPU是Intel。苹果公司建议永远不要检查操作系统版本,而是使用适当的方法来检查功能,但如果没有记录检查此功能的方法,是依赖于一个实现细节(“/usr/bin/rosetta”)更好,这个实现细节理论上可能已经改变了(但在Rosetta被杀死之前从未发生过),还是检查操作系统版本? - abarnert
4个回答

4

如果我记得没错,Rosetta安装失败后,只需在命令行中输入translate,它会显示一些使用屏幕。如果是这样的话,那么以下类似的命令应该有效。

if os.system("/usr/libexec/oah/translate > /dev/null 2>&1"):
  print "Not installed"
else:
  print "Installed"

尽管您可能想使用 /usr/bin/translate(或任何适当的路径),但为了防止某些人在路径上有不同的名为 translate 的东西(例如来自某些 Fink/MacPorts/Homebrew 包),建议您这样做。 - abarnert
用户不能选择在标准路径位置之外安装软件包吗?(只要它仍然是$PATH的一部分)?(我不知道,我不是Mac用户) - Joran Beasley
实际上,看起来工具是/usr/libexec/oah/translate,这个路径默认不在PATH中。因此,这样做行不通;您必须指定它的绝对路径。而且,@JoranBeasley:通常,对于作为操作系统内置部分的软件包,您无法选择安装位置。10.6有一个单独的子安装程序,您可以将其提取出来手动运行,如果您使用命令行安装程序界面进行操作,甚至可以给它一个根路径,但是该工具最终会放在同一个位置。 - abarnert
听起来没问题! :) 修改了上面的解决方案以反映这一点。 - Maria Zverina
1
我认为os.path.exists('/usr/libexec/oah/translate')可能是一个稍微更好的解决方案。如果存在,你就有了Rosetta。你的版本额外捕捉到的是那些拥有Rosetta但做了一些可怕的事情破坏它的人。(我验证了一个从10.5升级到10.7的机器会删除/usr/libexec/oah并用一个新的替换它,其中只包含RosettaNonGrata,这实际上是打印“不再支持PowerPC架构”的消息的东西。(奇怪的设计...) - abarnert
太棒了!感谢你的帮助!很抱歉让你等这么久! - Mizmor

0

尝试运行:

brew config

Rosetta 2: 真

enter image description here


0

如果您只是想检查具有 PPC 依赖项的内容是否能够运行,您可以进行松散的检查,即运行 CPU 类型为 PPC 或运行的 OS X 版本 >= 10.4 且 < 10.7,因为这些是支持 Rosetta 的 OS X 版本,在至少 10.6 上,如果尚未安装 Rosetta,则 OS X 将自动提示用户安装 Rosetta。请注意,Darwin 内核版本与 OS X 版本号不同,即 10.4 -> Darwin 8、10.5 -> 9 等:

>>> import os
>>> os.uname()
('Darwin', 'kitt.local', '11.4.0', 'Darwin Kernel Version 11.4.0: Mon Apr  9 19:32:15 PDT 2012; root:xnu-1699.26.8~1/RELEASE_X86_64', 'x86_64')
>>> un = os.uname()
>>> darwin_major_version = int(os.uname()[2].split('.')[0])
>>> cputype = un[4]
>>> can_run_ppc = cputype.startswith('ppc') or (darwin_major_version > 7 and darwin_major_version < 11)
>>> can_run_ppc
False

首先,>4 是错误的,因为 10.4 Intel 版本带有 Rosetta,所以你应该使用 >=4。但更重要的是,你不需要检查下限,因为在此之前的所有版本都只能在 PPC 上运行。作为一个小提示,苹果特别建议不要解析 uname 来获取内核版本;platform.mac_ver() 是更好的方法来获取这个信息。 - abarnert
没错,我已经将注释修正为“>= 10.4”。关于解析内核字符串的问题,我明白了,尽管在底层,platform.mac_ver本身也有点小技巧。无论如何,根据操作者的用例,还可能需要测试是否实际在OS X上运行,例如 sys.platform == 'darwin' - Ned Deily
是的,但最好使用标准库中的mac_ver,其中已经部署和测试了多年的hacky stuff,而不是尝试自己复制它。另外,>= 10.4仍然完全不必要,就像我说的那样。最后,这也无法处理10.6可选的Rosetta问题。 - abarnert
实际上,至少在最近的构建中,mac_ver使用gestalt.gestalt()和/或/System/Library/CoreServices/SystemVersion.plist,甚至处理了10.4对gestalt的更改。因此,它并不是“有点糊弄人”的;它使用了苹果批准的获取操作系统版本的方式。 - abarnert

0

没有官方方法可以获得这个。

Rosetta通过一个名为 /usr/libexec/oah/translate 的程序工作。官方上来说,这是一个实现细节,可能会发生变化,因此不应该依赖它。然而,我们知道它直到10.7之前从未改变,当Rosetta被完全删除时,所以尽管有警告,它仍是安全的。Maria Zverina的答案适用于这个(如果你添加路径),而且可能是最简单的。或者,只需检查是否存在这样的文件,而不是运行它。

另外,Rosetta随Intel 10.4-10.6一起提供(操作系统的早期版本仅支持PPC,没有Intel)。同样,官方上来说,您永远不应该依赖操作系统版本,而是使用适当的API来检查功能。但是,在这种情况下,似乎没有适当的API,因此也许这是合适的。除了一个警告,您不必在10.6中安装Rosetta,因此这不会检测关闭复选框的用户。如果你想要做到这一点:

import platform
release, versioninfo, machine = platform.mac_ver()
versionbits = [int(bit) for bit in release.split('.')]
rosetta = (versionbits < (10,7) and not machine.startswith('ppc'))

(请注意,这也是“不好的”,因为在某些版本中platform.mac_ver()会执行一些你不应该做的hacky的操作——获取OS X版本位的正确方法是调用Gestalt。但mac_ver()是标准库的一部分,所以至少你可以依赖它尽可能地执行hacky的操作,并且经过广泛测试。)

如果你实际上并不需要Rosetta,而只是想知道是否可以通过本机或通过Rosetta运行PPC,那就更简单了。所有不带有Rosetta的10.7以下预安装版本都是PPC;所有10.7+的版本都不能运行PPC。因此,只需使用“release< '10.7'”即可。(同样,请注意10.6可以选择跳过Rosetta安装。)


如果操作系统是OS X 10.10或更高版本,则您的测试将失败。最好按照我的答案建议进行拆分并转换为整数。 - Ned Deily
@NedDeily:好观点;更改为进行数字比较。(我太习惯在Cocoa/PyObjC等中使用NSNumericSearch来比较OS X版本了。) - abarnert

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