从python启动osascript并启动

时间:2014-03-18 00:42:46

标签: python applescript launchd osascript

这是我的小程序的要点

一个python脚本,用于检查某个目录中是否有新文件(电影文件)并相应地更新sqlite3数据库,从而对要处理的文件进行排队。使用launchctl每分钟运行一次。

另一个python脚本,它使用HandBrake命令行界面执行转换文件的实际处理。还使用launchctl每分钟运行一次。

在第二个脚本中,转换完成后,我想启动一个AppleScript,将文件导入带有某些元数据的iTunes。

所以,目录中的新电影文件 - >文件排队 - >文件被转换 - >文件在iTunes中导入。

我遇到的问题是AppleScript部分。如果我通过终端运行我的第二个python脚本(转换然后导入的脚本),一切运行顺利。该文件被转换,然后applescript将其导入iTunes。但如果启动脚本的启动器,它似乎正在跳过AppleScript部分。

这里是python中带有applescript的位

import subprocess, shlex
cmd = "/usr/bin/osascript /Users/alexis/Developer/Media/import_iTunes.scpt '{0}' ".format(file)
subprocess.Popen(shlex.split(cmd), stdout=subprocess.PIPE)

和AppleScript(为了简单起见,我删除了一些部分)

on run argv
    set newTrackPath to posix file (item 1 of argv)
    tell application "iTunes"
        activate
        set newTrack to add newTrackPath
    end tell
end run

我尝试过使用subprocess.call(cmd),os.system(cmd)和subprocess.Popen(cmd)。

问题似乎是当使用launchctl启动那个非常python的脚本时,你无法从python启动osascript。

任何人都有解释或解决方法吗?

谢谢

1 个答案:

答案 0 :(得分:2)

运行Python脚本的用户launchd是什么?我假设您将其作为当前用户的用户代理运行;如果没有,你应该。

您的shlex代码既冗余又不安全(例如,考虑尝试导入I Wanna Be Bobby's Girl.mp3时会发生什么)。只需直接组装参数列表。

您的Python代码无需等待子进程完成或检查其返回代码,因此任何失败都将以静默方式传递。您需要解决这个问题:如果您确实知道它们是什么,那么解决任何子流程错误会更容易。

如果你不关心AppleScript的输出,你可以使用check_call便利功能,如果AppleScript失败会抛出异常:

subprocess.check_call(["/usr/bin/osascript", 
        "/Users/alexis/Developer/Media/import_iTunes.scpt", file])

(或者,如果你有一个实际的理由直接使用Popen并且已经将相关代码省略为“简单”,请显示它以便我们可以看到你实际在做什么。)

您可能还想调整launchd XML,以便将Python脚本的stderr写入文件以便于查看。