1

これが私の小さなプログラムの要点です

特定のディレクトリに新しいファイル (ムービー ファイル) があるかどうかを確認し、それに応じて sqlite3 データベースを更新し、処理するファイルをキューに入れる 1 つの Python スクリプト。launchctl で毎分実行します。

HandBrake コマンド ライン インターフェイスを使用してファイルを変換する実際の処理を行う別の python スクリプト。また、launchctl で毎分実行されます。

その 2 番目のスクリプトでは、変換が完了したら、特定のメタデータを使用してファイルを iTunes にインポートする AppleScript を開始します。

そのため、ディレクトリ内の新しいムービー ファイル -> ファイルがキューに登録されます -> ファイルが変換されます -> ファイルが iTunes にインポートされます。

私が抱えている問題は、applescript の部分にあります。2 つ目の 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) を使用してみました。

問題は、まさにその python スクリプトが launchctl で起動されたときに、python から osascript を起動できないことです。

誰にも説明や回避策がありますか?

ありがとうございました

4

1 に答える 1

2

launchdPython スクリプトを実行しているユーザーは? 現在のユーザーのユーザーエージェントとして実行していると思います。そうでない場合は、そうする必要があります。

あなたの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直接使用する実際の理由があり、「単純さ」のために関連するコードを省略している場合は、それを示して、実際に何をしているかを確認してください。)

XMLを微調整launchdして、Python スクリプトの stderr をファイルに書き込んで簡単に確認できるようにすることもできます。

于 2014-03-18T21:22:49.670 に答える