1

这是我的小程序的要点

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

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

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

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

我遇到的问题是applescript部分。如果我通过终端运行我的第二个 python 脚本(转换然后导入的那个),一切都会顺利运行。该文件被转换,然后 applescript 将其导入 iTunes。但如果是启动脚本的launchctl,它似乎正在跳过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。

有人有解释或解决方法吗?

谢谢

4

1 回答 1

2

在哪个用户下launchd运行 Python 脚本?我假设您将它作为当前用户的用户代理运行;如果没有,你应该。

您的shlex代码既多余又不安全(例如,考虑在您尝试 import 时会发生什么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直接使用的实际理由并且为了“简单”而省略了相关代码,请展示它,以便我们可以看到您实际在做什么。)

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

于 2014-03-18T21:22:49.670 回答