【问题标题】:pass and receive values between python script and applescript在 python 脚本和 applescript 之间传递和接收值
【发布时间】:2012-11-21 22:07:38
【问题描述】:

我对 python 和 applescript 很陌生。我有一个调用 2 个 applescripts 的 python 脚本。我想在 python 中定义一些全局变量并传递给 applescript 1 ,这些值将由 applescripts 1 中的不同函数修改,然后传递回 python 脚本,然后将这些值传递给 applescript 2 使用。

我用谷歌搜索了一下,我尝试了以下方法:

在苹果脚本中,

on run argv 
    if (item 1 of argv is start with "x") then 
      function1(item1 of argv)
    else 
      function2 (item 1 of argv)
      function3 (item 2 of argv)
 end run

 on function1 (var)
  set var to (something code to get value from interaction with user)
 return var 
 end function1

在python脚本中 导入操作系统 导入系统

os.system ('osascript Setup.scpt')
variable1 = sys.argv[1]
variable2 = sys.argv[2]

在applescript2 中,我做了与applescirpt1 类似的事情。

但是,这不起作用。我试图打印出两个脚本中的所有 argv,看起来值没有正确传递。谁能给我更多的指导?谢谢!

【问题讨论】:

    标签: python applescript


    【解决方案1】:

    os.system():在子shell中执行命令(字符串)。这是通过调用标准 C 函数 system() 来实现的,并且具有相同的限制。

    sys.stdin, sys.stout 的更改不会反映在执行命令的环境中。 返回值是退出状态,而不是 osascript 输出。

    使用subprocess.Popen

    import os, sys, commands
    from subprocess import Popen, PIPE
    
    var1 = sys.argv[1] 
    var2 = sys.argv[2] 
    (var3, tError) = Popen(['osascript', '/Setup.scpt', var1, var2], stdout=PIPE).communicate()
    print var1
    print var2
    print var3
    

    osascript 命令总是返回一个string。 如果AppleScript返回list,则python中的字符串将用逗号和空格分隔。

    【讨论】:

    • 您可能需要考虑使用subprocess.check_output。我能够从类似的脚本中获取信息,但不需要拥有 PIPE 和交流项目。
    【解决方案2】:

    您必须从 applescript 中的“on run”处理程序返回一些内容,否则返回的结果只是最后一行代码的结果。所以你会想做这样的事情......

    on run argv
        set returnList to {}
    
        if (item 1 of argv starts with "x") then
            set end of returnList to function1(item1 of argv)
        else
            set end of returnList to function2(item 1 of argv)
            set end of returnList to function3(item 2 of argv)
        end if
    
        return returnList
    end run
    

    如果你想让用户提供一些东西,你的函数也需要看起来像这样。请注意,我告诉 Finder 显示对话框。那是因为您是从 python 运行它,如果某些应用程序不处理用户交互,它将出错。

    on function1(var)
        tell application "Finder"
            activate
            set var to text returned of (display dialog "Enter a value" default answer "")
        end tell
        return var
    end function1
    

    【讨论】:

    • 谢谢。这适用于 iTune 部分,打印出来的结果是正确的,但它仍然没有传递给 python sys.argv,还有什么方向吗?
    • 我不太了解python,但似乎您应该能够将第一个脚本的返回值设置为python中的变量。然后在调用第二个脚本时传递该变量。请注意,该变量是一个 applescript 列表,因此您的第二个脚本应该期望一个参数是一个列表。我确信一点谷歌搜索可以告诉你如何处理 python 中的变量。我给你的东西足以让你开始,现在由你来运行它。祝你好运。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-14
    • 2015-01-08
    • 1970-01-01
    相关资源
    最近更新 更多