Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在不使用osascript或appscript的情况下从Python调用AppleScript?_Python_Macos_Applescript - Fatal编程技术网

在不使用osascript或appscript的情况下从Python调用AppleScript?

在不使用osascript或appscript的情况下从Python调用AppleScript?,python,macos,applescript,Python,Macos,Applescript,有没有任何方法可以从python中执行AppleScript代码(并获得其结果),而无需使用osascript命令行实用程序,或者(我认为这是我不想使用的原因) 理由:在中,我描述了通过osascript运行一些AppleScript时遇到的奇怪/不希望出现的行为。实际上,当我从python脚本调用它时,我想知道是否有一种方法可以完全绕过osascript,因为这似乎是问题所在-但是appscript(显而易见的选择?)现在看起来很危险…您可以使用PyObjC桥: >>> fr

有没有任何方法可以从python中执行AppleScript代码(并获得其结果),而无需使用
osascript
命令行实用程序,或者(我认为这是我不想使用的原因)


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

您可以使用PyObjC桥:

>>> from Foundation import *
>>> s = NSAppleScript.alloc().initWithSource_("tell app \"Finder\" to activate")
>>> s.executeAndReturnError_(None)
PyPI是你的朋友

例如:

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
如果您希望在python代码中执行(applescript的后续版本),下面介绍如何执行:

script=None
def compileScript():
从OSAKit导入OSAScript,OSASlanguage
scriptPath=“path/to/file.jxa”
scriptContents=open(scriptPath,mode=“r”).read()
javascriptLanguage=OSALanguage.languageForName_U2;(“JavaScript”)
script=OSAScript.alloc().initWithSource_language(scriptContents,javascriptLanguage)
(成功,错误)=script.compileAndReturnError(无)
#仅当jxa写入错误时才会发生
如果不成功:
引发异常(“编译jxa脚本时出错”)
返回脚本
def execute():
#使用全局变量缓存已编译脚本以提高性能
全局脚本
如果不是脚本:
script=compileScript()
(结果,错误)=script.executeAndReturnError(无)
如果出现错误:
#错误结构示例:
# {
#NSLocalizedDescription=“错误:错误:无法获取对象。”;
#NSLocalizedFailureReason=“错误:错误:无法获取对象。”;
#OSAScriptErrorBriefMessageKey=“错误:错误:无法获取对象。”;
#OSAScriptErrorMessageKey=“错误:错误:无法获取对象。”;
#OSAScriptErrorNumberKey=“-1728”;
#OSAScriptErrorRangeKey=“NSRange:{0,0}”;
# }
引发异常(“jxa错误:{}”。格式(err[“NSLocalizedDescription”]))
#假设jxa脚本返回JSON
返回json.loads(result.stringValue())

谢谢!接受此答案,因为它具有最少的依赖项,尽管
py applescript
看起来也不错。:-)可能需要修复“NSApplScript”的拼写,在“Appl”之后添加“e”-我粘贴了您的代码,但第一次它不起作用!在导入错误的情况下:
没有名为Foundation的模块
,可以在导入语句之前使用
sys.path.append(“/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/Python/PyObjC”)
。谢谢-效果很好。我应该把PyPi加到我应该知道的事情清单上。PyPi确实是你的朋友。非常有帮助,非常经常!感谢您提供的示例,Help explain比包doc快得多。注意:py applescript的OSAscript功能依赖于PyObjC为什么不是python?在提出这个问题的时候它还不可用吗?看起来像是那个项目,所以不,它在2013年不可用。但是看起来不错,是的-谢谢!-)因为这只是一个围绕子进程调用的包装,它的代码是<代码> OASScript < /C>实用程序。JXA不能匹配Apple脚本的功能,并且在发布后几乎被放弃,所以我不认为它是一个继承者。有趣的是,没有意识到它比Apple Script更被抛弃了。它在哪些方面与AppleScript的功能不匹配?我很想了解更多。