我正在尝试从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)
答案 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
从字面上看,这应该是你必须做出的唯一改变。