Python使用osascript将文件路径变量传递给Applescript

时间:2014-04-05 06:21:14

标签: python applescript osascript

我正在尝试从Python传递一个文件路径到n Applescript,不知道如何实现它。下面的代码显示了正在运行的Applescript代码,该代码提示打开文件或文件,然后重新分配音频通道,保存和关闭。我没有提示输入文件,而是想将文件路径传递给osascript Applescript,我已经设置了args,但不知道如何让它工作。

from subprocess import Popen, PIPE

scpt = '''
    on run
        open (choose file with prompt ("Choose movie file(s)") ¬
        with multiple selections allowed)
    end run

    on open aa
        set channel_layouts_map1 to {¬
            {"Sound Track 1", "Sound Track 1", {"Left"}}, ¬
            {"Sound Track 2", "Sound Track 2", {"Right"}}, ¬
            {"Sound Track 3", "Sound Track 3", {"Center"}}, ¬
            {"Sound Track 4", "Sound Track 4", {"LFE Screen"}}, ¬
            {"Sound Track 5", "Sound Track 5", {"Left Surround"}}, ¬
            {"Sound Track 6", "Sound Track 6", {"Right Surround"}}, ¬
            {"Sound Track 7", "Sound Track 7", {"Left Total"}}, ¬
            {"Sound Track 8", "Sound Track 8", {"Right Total"}} ¬
                }
        set channel_layouts_map2 to {¬
            {"Sound Track 1", "Sound Track 1", {"Left"}}, ¬
            {"Sound Track 2", "Sound Track 2", {"Right"}}, ¬
            {"Sound Track 3", "Sound Track 3", {"Center"}}, ¬
            {"Sound Track 4", "Sound Track 4", {"LFE Screen"}}, ¬
            {"Sound Track 5", "Sound Track 5", {"Left Surround"}}, ¬
            {"Sound Track 6", "Sound Track 6", {"Right Surround"}}, ¬
            {"Sound Track 7", "Sound Track 7", {"Left Total", "Right Total"}} ¬
                }
        set channel_layouts_map3 to {¬
            {"Sound Track", "Sound Track", {"Left", "Right"}} ¬
                }
        set channel_layouts_map4 to {¬
            {"Sound Track 1", "Sound Track 1", {"Left"}}, ¬
            {"Sound Track 2", "Sound Track 2", {"Right"}} ¬
                }

        repeat with a in aa
            set f to a's POSIX path
            set k to count_sound_tracks(f, {_close:false})
            if k = 8 then
                remap_audio_channels(f, channel_layouts_map1)
            else if k = 7 then
                remap_audio_channels(f, channel_layouts_map2)
            else if k = 1 then
                remap_audio_channels(f, channel_layouts_map3)
            else if k = 2 then
                remap_audio_channels(f, channel_layouts_map4)
            else
                -- ignore it (just close it)
                close_document(f, {_save:false})
            end if
        end repeat
    end open

    on count_sound_tracks(f, {_close:_close})
        tell application id "com.apple.quicktimeplayer" -- QuickTime Player 7 Pro
            open (f as POSIX file)
            tell (document 1 whose path = f)
                repeat until exists
                    delay 0.2
                end repeat
                set k to count (tracks whose audio channel count > 0)
                if _close then close
            end tell
        end tell
        return k
    end count_sound_tracks

    on close_document(f, {_save:_save})
        tell application id "com.apple.quicktimeplayer" -- QuickTime Player 7 Pro
            tell (document 1 whose path = f)
                if exists then
                    if _save and modified then save
                    close
                end if
            end tell
        end tell
    end close_document

    on remap_audio_channels(f, channel_layouts_map)
        script o
            property map : channel_layouts_map
            property pp : {}
            property qq : {}

            -- get name and id of sound tracks
            tell application id "com.apple.quicktimeplayer" -- QuickTime Player 7 Pro
                activate
                open (f as POSIX file)
                tell (document 1 whose path = f)
                    repeat until exists
                        delay 0.2
                    end repeat
                    tell (tracks whose audio channel count > 0)
                        set {pp, qq} to {name, id} -- name and id of sound tracks
                    end tell
                end tell
            end tell

            -- remap audio channel layouts as specified
            tell application "System Events"
                tell (process 1 whose bundle identifier = "com.apple.quicktimeplayer")
                    -- open movie properties window
                    keystroke "j" using {command down}

                    tell (window 1 whose subrole = "AXDialog") -- properties for movie
                        repeat until exists
                            delay 0.2
                        end repeat
                        repeat with m in my map
                            set {trk, undef, layouts} to m
                            -- [TRK:
                            repeat 1 times
                                if trk's class = integer then
                                    if trk < 1 or trk > (count my pp) then exit repeat -- TRK:
                                    set trk to my pp's item trk
                                end if
                                tell scroll area 1
                                    tell table 1
                                        tell (row 1 whose text field 1's value = trk) -- target sound track whose name = trk
                                            if not (exists) then exit repeat -- TRK:
                                            select
                                        end tell
                                    end tell
                                end tell
                                tell tab group 1
                                    click radio button 3 -- audio settings
                                    tell scroll area 1
                                        tell table 1 -- channel assignment table
                                            set ix to count layouts
                                            repeat with i from 1 to count rows
                                                if i > ix then exit repeat
                                                tell row i -- channel i
                                                    tell pop up button 1
                                                        click
                                                        tell menu 1 -- channel assignment menu
                                                            tell (menu item 1 whose title = layouts's item i)
                                                                if exists then click
                                                            end tell
                                                        end tell
                                                    end tell
                                                end tell
                                            end repeat
                                        end tell
                                    end tell
                                end tell
                            end repeat
                            -- /TRK:]
                        end repeat

                        -- close movie properties window
                        click (button 1 whose subrole = "AXCloseButton")
                    end tell
                end tell
            end tell

            -- rename sound tracks as specified
            tell application id "com.apple.quicktimeplayer"
                tell document 1
                    repeat with m in my map
                        -- [RENAME:
                        repeat 1 times
                            set {x, y} to m's items 1 thru 2 -- {old name or index, new name or index}
                            if x's class = integer then
                                if x < 1 or x > (count my pp) then exit repeat -- RENAME:
                            else
                                set x to my _index_of(pp, x)
                                if x = 0 then exit repeat -- RENAME:
                            end if
                            if y's class = integer then
                                if y < 1 or y > (count my pp) then exit repeat -- RENAME:
                                set y to my pp's item y
                            end if
                            set p to my pp's item x
                            set q to my qq's item x
                            if p ≠ y then set track id q's name to y
                        end repeat
                        -- /RENAME:]
                    end repeat
                    if modified then save
                    close
                end tell
            end tell

        end script
        tell o to run
    end remap_audio_channels

    on _index_of(xx, x) -- renamed _bsearch() v0.1
        script o
            property aa : xx
            local i, j, k
            if {x} is not in my aa then return 0
            set i to 1
            set j to count my aa
            repeat while j > i
                set k to (i + j) div 2
                if {x} is in my aa's items i thru k then
                    set j to k
                else
                    set i to k + 1
                end if
            end repeat
            return i
        end script
        tell o to run
    end _index_of'''

args = ["/Users/me/Desktop/DOWNLOAD/44.mov"]

p = Popen(['osascript', '-'] + args, stdin=PIPE, stdout=PIPE, stderr=PIPE)
stdout, stderr = p.communicate(scpt)
print (p.returncode, stdout, stderr)

2 个答案:

答案 0 :(得分:1)

找到答案。需要将运行部分更改为:

on run argv
    repeat with a in argv
        set a's contents to a as POSIX file as alias
    end repeat
    open argv
end run

答案 1 :(得分:0)

根据osascript的手册页,参数将传递给运行处理程序。

所以就像你“打开aa”一样,你会“运行文件路径”,然后在“选择文件”中使用它。

on run filepath
    open (choose file with prompt ("Choose movie file(s)") ¬
    with multiple selections allowed default location filepath)
end run

从字面上看,这应该是你必须做出的唯一改变。