在終端啟動Python時報錯的解決
阿新 • • 發佈:2020-11-20
1 概述
- 在
Excel
中通過VBA
呼叫applescript
控制執行Mac,可以操作應用,執行.sh檔案
,構建複雜的工作流。 - 等價於在
Windows
裡用Shell()
呼叫.bat
檔案。 - Mac Excel 2016開始
AppleScript()
命令被棄用,官方說明見參考1。
2 命令結構 AppleScriptTask(arg1, arg2, arg3)
arg1 = applescript檔案的名字
- 存放位置固定,如果沒有,就新建一個。
- ~/Library/Application Scripts/com.microsoft.Excel/
坑!我沒注意前面有~,就建到/Library/Application Scripts/com.microsoft.Excel/,所以後面雖然東西都寫對了,執行一直報錯。。。直到看到參考資料3,才發現路徑是
Users/使用者名稱/
。
錯誤 = 執行時錯誤“5”:無效的過程呼叫或引數
arg2= applescript檔案中執行的handler(非同步的回撥函式/子程式),arg3=傳遞的引數
- 僅能執行接受一個引數的函式
- 在一個applescript如果有幾個函式,只執行叫做arg2引數指向的函式
一些保證能理解applescript的說明
- 使用自帶的指令碼編輯器測試程式碼
- 結構
on end
之間是函式 - 設定引數是 set x to 1 或者 set x to "a"
例一:官方例子,返回拼接的字串
on myapplescripthandler(paramString) #do something with paramString return "You told me " & paramString end myapplescripthandler
測試程式碼就是在applescript裡面再寫一行 myapplescripthandler("1")
,然後執行。
- 對應的vba程式碼
Sub runAppleSc()
Dim myScriptResult As String
myScriptResult = AppleScriptTask("MyAppleScriptFile.scpt", "myapplescripthandler", "1")
MsgBox myScriptResult
End Sub
例二:呼叫一句python語句
on PythonCommand(pythonScript) do shell script "python -c " & "'" & pythonScript & "'" end PythonCommand PythonCommand("print(42)")
注意裡面的引號,這句python -c後面應接引號,所以用雙引號加了一對單引號。
- 對應的vba程式碼
Sub CallPython()
Dim result As String
Dim pythonScript As String
pythonScript = "print(42)"
result = AppleScriptTask("PythonCommand.scpt", "PythonCommand", pythonScript)
MsgBox result
End Sub
例三:呼叫一個sh檔案
- .sh檔案在 /Users/yourname/Desktop,試執行的時候修改yourname為你的路徑。
- 檔名 1.sh
- 內容:生成一個內容是2,名字叫1.txt的檔案。
#!/bin/bash
echo 2 > /Users/yourname/Desktop/1.txt
-
注意如果不給全路徑,預設的路徑並不是檔案所在的地方,不知道在哪裡,但是是一個需要管理員許可權的地方,所以執行會報錯。
-
applescript
on runShell(path)
do shell script "'" & path & "'"
end runShell
set x to "/Users/yourname/Desktop/1.sh"
runShell(x)
- vba 程式碼
Sub runShell()
Dim myScriptResult As String
myScriptResult = AppleScriptTask("path.scpt", "runShell", "/Users/weishuang/Desktop/1.sh")
End Sub
3 執行說明
- 只要不報錯,就表示執行成功了
- 輸出的結果需要通過賦值獲得,如例一,例二
- 因為有括號,即使沒有輸出結果,也必須賦值,不然會報錯
- 不想賦值寫成
AppleScriptTask arg1, arg2, arg3
4 完整操作
- VBA中編寫程式碼
- 確定指定的applescript存放位置存在
- 指定位置新建applescript檔案
- applescript檔案中編寫接收一個引數的函式
- 執行VBA中的程式碼
5 參考資料
[1] 官方說明
[2] 執行Python
[3] 複雜例子,發現哪裡錯誤
[4] Applescript簡介