通过Excel VBA运行Python脚本。

3

我在Excel VBA中运行Python脚本时遇到了问题。以下是VBA代码:

Sub RunPython()
    
    Dim objShell As Object
    Dim PythonExe, PythonScript As String
    Set objShell = VBA.CreateObject("Wscript.Shell")
    PythonExe = """C:\Users\carlo\AppData\Local\Microsoft\WindowsApps\python3.exe""" 
    PythonScript = """C:\Users\carlo\Desktop\MSc_Thesis\ML applications\BlackBox\BlackBoxAbsorbers.py"""  
    objShell.Run PythonExe & PythonScript

End Sub

以下是Python代码。

print("hello")
input("hello, press enter")

当我运行VBA时,Python执行程序会打开,但立即关闭,未实际执行脚本。换句话说,在Python执行器窗口上既没有“ hello”也没有“ hello, press enter”,它突然关闭了。
我确信python.exe和python脚本的路径都是正确的。我尝试过使用""""和""两种写法,但两种情况下都无法工作。显然(非常简单!)如果我直接从Python执行器运行脚本,则Python脚本可以正常工作。
2个回答

2
解决了!我不明白为什么,但是将objShell.Run PythonExe和objShell.Run PythonScript分开来使用就可以正常工作了!像这样:
Public Sub RunPython()    
    Dim objShell As Object
    Set objShell = VBA.CreateObject("Wscript.Shell")

    Dim PythonExe As String
    PythonExe = """C:\Users\carlo\AppData\Local\Microsoft\WindowsApps\python3.exe""" 

    Dim PythonScript As String
    PythonScript = """C:\Users\carlo\Desktop\MSc_Thesis\ML applications\BlackBox\BlackBoxAbsorbers.py"""  
    
     objShell.Run PythonExe
     objShell.Run PythonScript

End Sub

不管怎样,感谢你@Pᴇʜ,我会把你的回答评为积极的,因为你非常友善!


只需检查是否在没有“objShell.Run PythonExe”的情况下正常工作。当然,您可以在一天后接受自己的答案作为解决方案。 - Pᴇʜ
那就意味着它可以工作了,因为 Windows 自动将 .py 文件类型与 Python 关联起来。 - Pᴇʜ

0

你可能需要在PythonExe & " " & PythonScript之间添加一个空格。所以你要运行的命令是"C:\…\python3.exe" "C:\…\BlackBoxAbsorbers.py" 前面的程序路径和后面的Python脚本之间有一个空格。

此外,请注意Dim PythonExe, PythonScript As String只声明了PythonScript As String,而PythonExe As Variant。在VBA中,您需要为每个变量指定类型:Dim PythonExe As String, PythonScript As String或默认情况下为Variant

另外,objShell.Run PythonExe & PythonScript不能很好地进行调试。建议将命令放入变量中,以便可以在立即窗口中打印它进行调试:

Dim Command As String
Command = PythonExe & PythonScript

Debug.Print Command

objShell.Run Command 

如果您这样做,您将看到您的命令输出为:
"C:\Users\carlo\AppData\Local\Microsoft\WindowsApps\python3.exe""C:\Users\carlo\Desktop\MSc_Thesis\ML applications\BlackBox\BlackBoxAbsorbers.py"

这两个字符串之间实际上应该有空格,但它们之间没有:

"C:\Users\carlo\AppData\Local\Microsoft\WindowsApps\python3.exe" "C:\Users\carlo\Desktop\MSc_Thesis\ML applications\BlackBox\BlackBoxAbsorbers.py"

所以我建议:

Public Sub RunPython()    
    Dim objShell As Object
    Set objShell = VBA.CreateObject("Wscript.Shell")

    Dim PythonExe As String
    PythonExe = """C:\Users\carlo\AppData\Local\Microsoft\WindowsApps\python3.exe""" 

    Dim PythonScript As String
    PythonScript = """C:\Users\carlo\Desktop\MSc_Thesis\ML applications\BlackBox\BlackBoxAbsorbers.py"""  

    Dim Command As String
    Command = PythonExe & " " & PythonScript

    objShell.Run Command
End Sub

谢谢你的回答!但不幸的是,即使是你的代码版本对我也没有用.. :(( - Carlo Cortellini
@CarloCortellini Shell Command 能够运行吗? - Pᴇʜ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接