首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用wsh从vba调用python脚本

使用wsh从vba调用python脚本
EN

Stack Overflow用户
提问于 2016-09-07 03:46:29
回答 4查看 2.2K关注 0票数 3

我需要从vba调用python脚本,使用shell可以很好地工作。

代码语言:javascript
复制
Sub CallPythonScript()

        Call Shell("C:\Program Files (x86)\Python27\python.exe C:\Users\Markus\BrowseDirectory.py")

End Sub

但是当我尝试使用wsh时(因为它的等待功能),它就不再工作了。

代码语言:javascript
复制
Sub CallPythonScript()

    Dim wsh As Object
        Set wsh = VBA.CreateObject("WScript.Shell")

    Dim myApp As String: myApp = "C:\Program Files (x86)\Python27\python.exe C:\Users\Markus\BrowseDirectory.py"
    Dim waitOnReturn As Boolean: waitOnReturn = True
    Dim windowStyle As Integer: windowStyle = 1

    wsh.Run """"" & myApp & """"", windowStyle, waitOnReturn

End Sub

然而,我在家里使用了相同的代码,一切都很好,只是路径中没有任何空格。因此,很自然地,空格一定有什么问题。非常感谢您的帮助。

EN

回答 4

Stack Overflow用户

发布于 2016-09-07 04:15:11

除非您使用引号保护目录,否则解释器无法区分包含空格的目录和实参目录。

一种解决方法实际上是一种更好的解决方案,它依赖于这样一个事实: Python将.py扩展与安装的python解释器相关联。

只需执行以下操作(就像启动.bat文件一样):

代码语言:javascript
复制
Dim myApp As String: myApp = "C:\Users\Markus\BrowseDirectory.py"

无论python安装在哪里,您的代码都可以正常工作(空格的问题也就消失了)。

这个在excel中的小测试对我很有效,并且运行了我的系统PATH中的pycrust.py

代码语言:javascript
复制
Sub foo()
  Dim wsh As Object
  Set wsh = VBA.CreateObject("WScript.Shell")

    Dim myApp As String: myApp = "pycrust.py"
    Dim waitOnReturn As Boolean: waitOnReturn = True
    Dim windowStyle As Integer: windowStyle = 1

    wsh.Run myApp, windowStyle, waitOnReturn

End Sub

(我不得不简化您的wsh.Run行,因为它不工作,我怀疑您添加的256个引号没有任何好处)

票数 2
EN

Stack Overflow用户

发布于 2016-09-07 03:50:34

你有没有确认路径可以让你直接找到解释器?

尝尝这个,

代码语言:javascript
复制
Dim myApp As String: myApp = "C:\""Program Files (x86)""\Python27\python.exe C:\Users\Markus\BrowseDirectory.py"
票数 1
EN

Stack Overflow用户

发布于 2017-07-21 19:05:28

我的脚本在我的工作表和Python上工作(但我将工作表和py脚本放在同一个文件夹中):

代码语言:javascript
复制
Path = ActiveWorkbook.Path
Pth = """" & Path & "\pythonscript_name.py" & """"
Ph = """" & "C:\Python27\python.exe " & Pth & """"

Dim wsh As Object
Set wsh = VBA.CreateObject("WScript.Shell")
Dim waitOnReturn As Boolean: waitOnReturn = True
Dim windowStyle As Integer: windowStyle = 1
ErrorCode = wsh.Run(Ph, windowStyle, waitOnReturn)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39356710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档