如何判断是否安装了rosetta? --MacPython

时间:2012-07-09 18:12:03

标签: python macos operating-system rosetta

所以我正在开发一个依赖于rosetta安装的python脚本。无论如何要检查操作系统是否有罗塞塔?

谢谢!

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

如果您真的只是想检查是否可能会运行具有PPC依赖性的内容,则可以检查正在运行的CPU类型是PPC还是正在运行的OS X版本> = 10.4并且< 10.7因为那些是支持Rosetta的OS X版本,并且至少在10.6上,OS X会自动提示用户在需要时安装Rosetta(如果尚未安装)。请注意,Darwin内核版本与OS X版本号不同,即10.4 - >达尔文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

答案 2 :(得分:0)

没有正式的方法可以解决这个问题。

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

或者,Rosetta附带英特尔10.4-10.6(操作系统的早期版本仅限PPC且没有英特尔)。再说一次,官方你永远不应该依赖操作系统版本,而是使用适当的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期间。所以,只需“发布&lt; '10 .7'”即可。 (再次注意,10.6可以选择跳过Rosetta安装。)