2012-11-21 67 views
1

我對python和applescript很陌生。我有一個調用2個applescripts的python腳本。我想在python中定義幾個全局變量並傳遞給applescript 1,這些值將被applescripts 1中的不同函數修改,然後傳回python腳本,然後將這些值傳遞給applescript 2以供使用。在python腳本和applescript之間傳遞和接收值

我用Google搜索了一下,我試過如下:

在AppleScript的

on run argv 
    if (item 1 of argv is start with "x") then 
     function1(item1 of argv) 
    else 
     function2 (item 1 of argv) 
     function3 (item 2 of argv) 
end run 

on function1 (var) 
    set var to (something code to get value from interaction with user) 
return var 
end function1 
在python腳本

進口OS 進口SYS

os.system ('osascript Setup.scpt') 
variable1 = sys.argv[1] 
variable2 = sys.argv[2] 
在applescript2

,我與applescirpt1做類似的事情。

但是,這沒有奏效。我試圖在兩個腳本中打印出所有的argv,看起來這些值沒有正確傳遞。任何人都可以給我更多的方向嗎?謝謝!

回答

0

os.system():在子shell執行命令(字符串)。這是通過調用標準C函數系統()來實現的,並且具有相同的限制。

更改爲sys.stdin, sys.stout未反映在執行的命令的環境中。 返回值是退出狀態,而不是osascript輸出。

使用subprocess.Popen

import os, sys, commands 
from subprocess import Popen, PIPE 

var1 = sys.argv[1] 
var2 = sys.argv[2] 
(var3, tError) = Popen(['osascript', '/Setup.scpt', var1, var2], stdout=PIPE).communicate() 
print var1 
print var2 
print var3 

osascript命令總是返回string。 如果AppleScript返回list,python中的字符串將用逗號和空格分隔。

+0

太棒了!這正是我期待的!謝謝! –

+0

您可能要考慮使用[subprocess.check_output](https://docs.python.org/2/library/subprocess.html#subprocess.check_output)。我能夠從類似的腳本獲取信息,但不需要PIPE和通信項目。 – slaughter98

0

你必須從applescript中的「on run」處理程序返回一些東西,否則返回的結果只是最後一行代碼的結果。所以你會想要做這樣的事情...

on run argv 
    set returnList to {} 

    if (item 1 of argv starts with "x") then 
     set end of returnList to function1(item1 of argv) 
    else 
     set end of returnList to function2(item 1 of argv) 
     set end of returnList to function3(item 2 of argv) 
    end if 

    return returnList 
end run 

如果你想要用戶提供的東西,你的功能將需要看起來像這樣。請注意,我正在告訴Finder顯示對話框。那是因爲你正在從python運行它,如果某些應用程序不處理用戶交互,它將會出錯。

on function1(var) 
    tell application "Finder" 
     activate 
     set var to text returned of (display dialog "Enter a value" default answer "") 
    end tell 
    return var 
end function1 
+0

謝謝。這在iTune的部分工作,打印輸出結果是正確的,但它仍然沒有傳遞給python sys.argv,更多的方向? –

+0

我不太瞭解python,但它似乎應該能夠將第一個腳本的返回值設置爲python中的變量。然後在調用第二個腳本時傳遞該變量。請注意,該變量是一個applescript列表,所以你的第二個腳本應該期望一個參數是一個列表。我敢肯定,一點Google可以告訴你如何處理python中的變量。我已經給了你足夠的啓動時間,現在就由你來運行吧。祝你好運。 – regulus6633

相關問題