【问题标题】:How to tell if rosetta is installed?如何判断是否安装了rosetta?
【发布时间】:2012-07-09 04:24:21
【问题描述】:

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

【问题讨论】:

  • 就像在罗塞塔石碑(学习语言的东西?)?
  • 不。如:Rosetta 是 Mac OS X 的动态二进制翻译器,它允许许多 PowerPC 应用程序在某些基于 Intel 的 Macintosh 计算机上运行而无需修改。 (从维基百科粘贴)
  • 你能从 python 运行“which rosetta”并检查你是否得到任何回报?这不能确定它是否已安装?
  • Maria Zverina 的解决方案可能是最好的。我能想到的唯一选择是 OS

标签: python macos operating-system rosetta


【解决方案1】:

还没有安装rosetta,但如果我没记错的话,如果你只输入translate(rosetta 命令行),它会给出某种使用屏幕。如果是这样,这样的事情应该可以工作。

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

【讨论】:

  • +1。尽管您可能想使用 /usr/bin/translate (或任何适当的路径),以防有人在路径的其他地方(例如,来自某些 Fink/MacPorts/Homebrew 包)有不同的东西,称为 translate。
  • 用户不能选择在其标准路径位置之外安装软件包(只要它仍然是 $PATH 的一部分)? (我不知道我不是 Mac 人)
  • 其实这个工具好像是/usr/libexec/oah/translate,默认不在PATH上。所以这不会按原样工作;您必须指定它的绝对路径。而且,@JoranBeasley:通常,对于作为操作系统内置部分的软件包,您无法选择安装它们的位置。 10.6 有一个单独的子安装程序,您可以将其拉出并手动运行,如果您使用命令行安装程序界面执行此操作,您甚至可以为其指定一个根路径,但该工具最终位于同一个位置。
  • 听起来不错! :) 修改了上面的解决方案以反映这一点。
  • 我认为 os.path.exists('/usr/libexec/oah/translate') 可能是一个更好的解决方案。如果它存在,你就有了 Rosetta。你的版本捕获的唯一额外的东西是那些拥有 Rosetta 但做了一些可怕的事情来破坏它的人。 (我验证了升级到 10.7 的 10.5 机器删除了 /usr/libexec/oah 并将其替换为仅包含 RosettaNonGrata 的新机器,这实际上打印了“不再支持 PowerPC 架构”消息。(奇怪的设计那里…)
【解决方案2】:

如果您真的只是想检查是否有可能运行具有 PPC 依赖项的东西,您可以松散地检查正在运行的 CPU 类型是 PPC 还是正在运行的 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 上运行。作为一个小提示,Apple 特别建议不要解析 uname 来获取内核版本; platform.mac_ver() 是一种更好的方法。
  • 对,我已将评论修正为 >= 10.4。关于解析内核字符串的要点,尽管platform.mac_ver 本身就是一种hacky。在任何情况下,根据 OP 的用例,可能还需要对在 OS X 上实际运行进行测试,例如 `sys.platform == 'darwin'。
  • 是的,但是使用标准库的一部分 mac_ver 比尝试自己复制它要好得多。此外,正如我所说, >= 10.4 仍然完全没有必要。最后,这不处理 10.6 可选的 Rosetta 问题。
  • 实际上,至少在最近的版本中,mac_ver 使用了 gestalt.gestalt() 和/或 /System/Library/CoreServices/SystemVersion.plist,它甚至处理了 10.4 对格式塔的更改。所以它不是“有点老套”;它使用 Apple 认可的方式来获取操作系统版本。
【解决方案3】:

没有官方的方法可以得到这个。

Rosetta 通过一个名为 /usr/libexec/oah/translate 的程序工作。正式地,这是一个可能会更改的实现细节,因此不应依赖。然而,我们知道它直到 10.7 才发生变化,当时罗塞塔被完全杀死,所以尽管有警告,但它是安全的。 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() 会做一些你不应该做的骇人听闻的事情——获取 OS X 版本位的正确方法是调用 Gestalt。但是mac_ver() 是标准库的一部分,所以至少你可以依靠它来尽可能好地做一些骇人听闻的事情,并且它正在被广泛测试。)

如果您实际上不是在使用 Rosetta,但您是否可以在本机或通过 Rosetta 运行 PPC,那就更简单了。 Rosetta 未附带的所有 pre-10.7 版本都是 PPC;所有 10.7+ 版本都无法运行 PPC 期。所以,只需“release

【讨论】:

  • 如果有 OS X 10.10 或更高版本,您的测试将失败。最好按照我在回答中的建议进行拆分并转换为整数。
  • @NedDeily:好点;改为进行数值比较。 (在比较 OS X 版本时我太习惯使用 NSNumericSearch,因为我通常在 Cocoa/PyObjC/etc 中这样做。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-26
  • 2010-09-16
  • 2012-06-25
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多