我在OSX上的Excel 365中有一个VBA宏,我想启动一个外部进程(一个python脚本),它将生成一个文件导入Excel。如何在OSX上从Excel 365 VBA启动外部python进程?
我已经尝试了很多东西,但都没有为我工作。我已在下面列出它们。
我第一次尝试是使用:
Shell ("/usr/local/bin/python /tmp/myScript.py")
>> Run-time error '76': Path not found
然后我读它首选旧的Mac风格的路径,所以没有
Shell ("Macintosh HD:usr:local:bin:python /tmp/myScript.py")
>> Run-time error '76': Path not found
这一点,在我的系统,是一个符号链接,因为我使用的是HomeBrew,因此我解析了链接指向的位置并运行了该代码:
Shell ("Macintosh HD:usr:local:Cellar:python:2.7.10_2:Frameworks:Python.framework:Versions:2.7:bin:python /tmp/myScript.py")
>> Run-time error '76': Path not found
并且为了防万一,里德是一个具有UNIX风格路径:
Shell ("/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/bin/python /tmp/myScript.py")
>> Run-time error '76': Path not found
然后我试图使用MacScript运行它:
MacScript ("do shell script " + Chr(34) + "/usr/local/bin/python /tmp/myScript.py" + Chr(34))
>> Run-time error '5': Invalid procedure call or argument
所以,在我看来,MacScript()不可用在此版本中VBA的。
后来我发现描述如何揭示libc中的system
方法的文章:
Private Declare Function system Lib "libc.dylib" (ByVal command As String) As Long
system("/usr/local/bin/python /tmp/myScript.py")
>> Compile error: The code in this project must be updated for use on 64-bit systems. Please review and update DEclare statements and then mark them with the PtrSafe attribute.
做了一些更多的挖掘来检查,我要补充这给了我:
Private Declare PtrSafe Function system Lib "libc.dylib" (ByVal command As String) As Long
system("/usr/local/bin/python /tmp/myScript.py")
>> Run-time error '453': File not found: libc.dylib
认为它可能是sym-link相关的,我发现有一个sym链的链接libc.dylib -> libSystem.dylib -> libSystem.B.dylib
,所以我试过的最后一件事是:
Private Declare PtrSafe Function system Lib "libSystem.B.dylib" (ByVal command As String) As Long
system("/usr/local/bin/python /tmp/myScript.py")
>> Run-time error '453': File not found: libSystem.B.dylib
这就是我设法得到的。有人能从这里指出我的正确方向吗?
谢谢