我需要从vba调用python脚本,使用shell可以正常工作。
Sub CallPythonScript()
Call Shell("C:\Program Files (x86)\Python27\python.exe C:\Users\Markus\BrowseDirectory.py")
End Sub
但是当我尝试使用wsh(因为等待功能)时它就不再适用了。
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
但是,我在家里使用了相同的代码,一切都很顺利,区别在于路径中没有任何空白。所以空白肯定会出现问题。非常感谢帮助。
答案 0 :(得分:2)
除非用引号保护目录,否则解释器不可能将包含空格的目录与真实参数区分开来。
解决方法实际上是一种更好的解决方案,它依赖于Python将.py
扩展名与已安装的python解释器相关联的事实。
只需执行此操作(就像启动.bat
文件一样):
Dim myApp As String: myApp = "C:\Users\Markus\BrowseDirectory.py"
并且无论python安装在哪里(和空格问题都消失了),你的代码都会正常工作
excel中的这个小测试对我起作用并运行pycrust.py
,这恰好在我的系统中PATH
:
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引号没有做任何好处)
答案 1 :(得分:1)
您是否验证该路径直接将您带到解释器?
试试这个,
Dim myApp As String: myApp = "C:\""Program Files (x86)""\Python27\python.exe C:\Users\Markus\BrowseDirectory.py"
答案 2 :(得分:0)
我的脚本适用于我的工作表和Python(但是我将工作表和py脚本放在同一个文件夹中):
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)
答案 3 :(得分:0)
我不知道这是否可以解决您的问题,但是在尝试使用CX-Freeze(来自VBA和wsh)启动python脚本“冻结”时遇到了相同的问题。一切正常,直到我将EXE文件的文件夹名称更改为带空格的名称为止。在阅读您的帖子和您提到的空格之前,我不理解这个问题。
我在Internet上找到了一个函数(也许在SO上,我不记得了),该函数为我提供了DOS中文件夹的名称。如果像我一样,您必须传递一些名为文件夹名称的参数,然后重用该函数在DOS中为您提供名称。
以下是在互联网上找到的功能:
Public Function GetShortFileName(ByVal FullPath As String) As String
'PURPOSE: Returns DOS File Name (8.3 Format) Give
'FullPath for long file name
'PARAMETERS: FullPath: Full Path of Original File
'RETURNS: 8.3 FileName, or "" if FullPath doesn't
' exist or file fails for other reasons
'EXAMPLE:
' GetShortFileName("C:\Nouveau dossier\Nouveau dossier\Nouveau
dossier\Nouveau dossier\Nouveau dossier\")
Dim lAns As Long
Dim sAns As String
Dim iLen As Integer
On Error Resume Next
'this function doesn't work if the file doesn't exist
If Dir(FullPath) = "" Then Exit Function
sAns = Space(255)
lAns = GetShortPathName(FullPath, sAns, 255)
GetShortFileName = Left(sAns, lAns)
End Function
您可以通过以下方式制作自己的潜艇:
Dim wsh As Object
Set wsh = VBA.CreateObject("WScript.Shell")
Dim waitOnReturn As Boolean: waitOnReturn = True
Dim windowStyle As Integer: windowStyle = 1
Dim program_folder_path
Dim file_path
program_folder_path = "C:\Program Files (x86)\Python27\"
program_folder_path = CStr(GetShortFileName(program_folder_path))
file_path = "C:\Users\Markus\BrowseDirectory.py"
file_path = CStr(GetShortFileName(file_path))
wsh.Run program_folder_path & "python.exe" & file_path, windowStyle,_
waitOnReturn
我希望这会有所帮助,对不起,我的英语不好...