当前位置: 首页 > 知识库问答 >
问题:

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

戚翼
2023-03-14

我试图从Python传递一个文件路径到n Applescript,不知道如何实现它。下面的代码显示了工作的Applescript代码,它提示打开一个或多个文件,然后重新分配音频通道,保存和关闭。而不是提示一个或多个文件,我想将文件路径传递到osascript Applescript,我已经设置了参数,但不确定如何让它工作。

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个答案

贺光华
2023-03-14

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

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

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

从字面上说,这应该是你唯一需要做的改变。

宦瀚
2023-03-14

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

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
 类似资料:
  • 问题内容: 我迷路了。如何将循环变量传递给AJAX .done()调用? 显然,如果我要这样做, 我 将在每次迭代中返回对象中的最后一个键。文档使我失望。 问题答案: 您可以使用闭包(通过自执行函数)来捕获每次循环调用的值,如下所示:

  • 问题内容: 我想根据例如从jenkins传递的变量来运行测试用例,请选择要运行的测试用例:testcaseOne,testcaseTwo 在pom.xml(maven)中: 我有两个testng @test方法: 还有我的testng.xml文件: 如何根据我要运行的测试数量和数量来传递此参数?也许有完全不同的方式来做到这一点? 问题答案: 您可以在testng.xml文件http://testn

  • 问题内容: 我看过类似的论坛,但无法获得任何有效的解决方案。我正在尝试将变量从Flask传递到我的JavaScript文件。这些值将用于我的JavaScript文件中的PubNub。 这是我的Python代码的一部分: 这是我的JavaScript代码(app.js)的一部分: 如果我在Settings.html文件中使用了此代码,而在app.js文件中却没有使用,则此代码有效。 问题答案: 该m

  • 问题内容: 我正在使用Google Maps制作可以加载数据库中包含经纬度数据的标记的地图。我希望用户可以通过单击按钮来加载三个不同的“图层”。单击该按钮时,将在服务器上执行php函数,从而根据数据库中的信息创建xml文件。然后调用AJAX函数提取此xml数据,然后将其用于创建地图标记。没有为每个“层”使用单独的PHP函数(除了SQL查询所在的行,这是相同的东西),有没有办法将AJAX中的java

  • 问题内容: 我似乎无法从php中将变量传递给我的bash脚本。无论我如何尝试,$ uaddress和$ upassword都变为空。 *_ __ _ __ __ * __ __ bash * __ __ * * ** *_ __ _ __ * PHP __ * __ __ * __ ** *_ __ _ _ _输出和调试 _ _ _ * *_ 问题答案: 您需要将变量作为参数传递给Shell脚本,

  • 问题内容: 我正在尝试将变量从node.js传递到我的HTML文件。 问题答案: 我发现我可以传递这样的变量