1. 程式人生 > 實用技巧 >在終端啟動Python時報錯的解決

在終端啟動Python時報錯的解決

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的說明

  1. 使用自帶的指令碼編輯器測試程式碼
  2. 結構 on end 之間是函式
  3. 設定引數是 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 完整操作

  1. VBA中編寫程式碼
  2. 確定指定的applescript存放位置存在
  3. 指定位置新建applescript檔案
  4. applescript檔案中編寫接收一個引數的函式
  5. 執行VBA中的程式碼

5 參考資料

[1] 官方說明
[2] 執行Python
[3] 複雜例子,發現哪裡錯誤
[4] Applescript簡介