当前位置: 首页 > 知识库问答 >
问题:

从Python调用AppleScript而不使用osascript或appcript?

百里锋
2023-03-14

有没有什么方法可以在不使用osascript命令行实用程序或appscript的情况下从python执行AppleScript代码(并获得其结果)(我想我真的不想使用它?)因为它不再被开发/支持/推荐)?

理由:在我刚刚发布的另一个问题中,我描述了通过osascript运行AppleScript时遇到的一种奇怪/不希望出现的行为。实际上,我是从python脚本中调用它的,我想知道是否有一种方法可以完全绕过osascript,因为这似乎就是问题所在——但是appscript(显而易见的选择?)现在看起来很危险。。。

共有3个答案

商俊智
2023-03-14

如果您希望在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())
赵俊侠
2023-03-14

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
柴文林
2023-03-14

您可以使用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