有没有什么方法可以在不使用osascript
命令行实用程序或appscript的情况下从python执行AppleScript代码(并获得其结果)(我想我真的不想使用它?)因为它不再被开发/支持/推荐)?
理由:在我刚刚发布的另一个问题中,我描述了通过osascript
运行AppleScript时遇到的一种奇怪/不希望出现的行为。实际上,我是从python脚本中调用它的,我想知道是否有一种方法可以完全绕过osascript
,因为这似乎就是问题所在——但是appscript(显而易见的选择?)现在看起来很危险。。。
如果您希望在python代码中执行“Javascript for Automation”(applescript的后续版本),请看以下方法:
script = None
def compileScript():
from OSAKit import OSAScript, OSALanguage
scriptPath = "path/to/file.jxa"
scriptContents = open(scriptPath, mode="r").read()
javascriptLanguage = OSALanguage.languageForName_("JavaScript")
script = OSAScript.alloc().initWithSource_language_(scriptContents, javascriptLanguage)
(success, err) = script.compileAndReturnError_(None)
# should only occur if jxa is incorrectly written
if not success:
raise Exception("error compiling jxa script")
return script
def execute():
# use a global variable to cache the compiled script for performance
global script
if not script:
script = compileScript()
(result, err) = script.executeAndReturnError_(None)
if err:
# example error structure:
# {
# NSLocalizedDescription = "Error: Error: Can't get object.";
# NSLocalizedFailureReason = "Error: Error: Can't get object.";
# OSAScriptErrorBriefMessageKey = "Error: Error: Can't get object.";
# OSAScriptErrorMessageKey = "Error: Error: Can't get object.";
# OSAScriptErrorNumberKey = "-1728";
# OSAScriptErrorRangeKey = "NSRange: {0, 0}";
# }
raise Exception("jxa error: {}".format(err["NSLocalizedDescription"]))
# assumes your jxa script returns JSON
return json.loads(result.stringValue())
PyPI是你的朋友。。。
http://pypi.python.org/pypi/py-applescript
例子:
import applescript
scpt = applescript.AppleScript('''
on run {arg1, arg2}
say arg1 & " " & arg2
end run
on foo()
return "bar"
end foo
on Baz(x, y)
return x * y
end bar
''')
print(scpt.run('Hello', 'World')) #-> None
print(scpt.call('foo')) #-> "bar"
print(scpt.call('Baz', 3, 5)) #-> 15
您可以使用PyObjC桥:
>>> from Foundation import *
>>> s = NSAppleScript.alloc().initWithSource_("tell app \"Finder\" to activate")
>>> s.executeAndReturnError_(None)
我有运行一些Applescript的bash函数。如果我在Applescript编辑器或Textate中运行Applescript部分,它可以正常工作,但是在命令行上,函数失败了... 错误是: 我知道(认为)问题在于这一行的第一个bash转义序列: 但我不知道为什么失败了。。。你知道为什么这行不通吗? 编辑1:我也尝试过这个,但失败了: 错误消息:
我试图从Python传递一个文件路径到n Applescript,不知道如何实现它。下面的代码显示了工作的Applescript代码,它提示打开一个或多个文件,然后重新分配音频通道,保存和关闭。而不是提示一个或多个文件,我想将文件路径传递到osascript Applescript,我已经设置了参数,但不确定如何让它工作。
问题内容: 我现在正在开发一个框架,其中一部分需要Jython。我只是使用MatPlotLib向其中添加了一些绘图,却没有意识到MatPlotLib与Jython不兼容。由于这两部分是非常孤立的,我可以在Python中运行大多数程序,并将少量信息传递给Jython部分(反之亦然),所以我想知道是否有一种简单的方法可以做到这一点,而保持框架的模块化性质。有想法吗? 问题答案: 我没有将execnet
问题内容: 我最近安装了蟒蛇的蟒蛇版本。现在,当我在终端输入内容时,它将打开anonconda发行版,而不是默认发行版。如何在Linux(ubuntu 12.04)中使用默认版本的命令? 问题答案: anaconda会将路径添加到您的,因此首先会找到它,您可以将路径添加到默认python,也可以将其删除(如果不想使用)。 您还可以在bash中使用完整路径来使用默认的python解释器。 如果按原样
问题内容: 我最近安装了Python的Anaconda版本。现在,当我在终端中键入内容时,它将打开Anaconda发行版,而不是默认发行版。如何在Linux(Ubuntu 12.04 (Precise Pangolin))上使用默认版本的命令? 问题答案: Anaconda将路径添加到,因此首先找到它。您可以将路径添加到默认Python实例,也可以将路径删除到Anaconda(如果您不想使用它)。
以下是我的小程序的要点 一个python脚本,用于检查某个目录中是否有新文件(电影文件),并相应地更新sqlite3数据库,从而将要处理的文件排队。使用launchctl每分钟运行一次。 另一个python脚本,使用HandBrake命令行界面进行文件转换的实际处理。还可以使用launchctl每分钟运行一次。 在第二个脚本中,转换完成后,我想启动一个applescript,将文件导入到iTune