Выполнение файла vbs с аргументами, созданными python

Я хотел бы конвертировать десятки листов excel в файлы csv сразу. У меня есть рабочий файл .vbs, который делает преобразование, и я хотел бы выполнить этот .vbs файл на разных листах с помощью кода python. У меня есть следующие 2 версии кода python:

Версия 1:

import os
import sys
import subprocess

FolderName=sys.argv[1]
FileList=os.listdir(FolderName)
NewList=[]

for i in FileList:
   NewItem=i.split('.xls')
   NewXls=FolderName+"\\"+NewItem[0]+".xlsx "
   NewCsv=FolderName+"\\"+NewItem[0]+".csv"
   NewCommand="C:\\Users\\user\\XlsToCsv.vbs "+sys.argv[2]+" "+NewXls+NewCsv
   subprocess.call(NewCommand)

Версия 2:

import os
import sys
import subprocess

def main(directory,extension,sheet):
 for filename in os.listdir(directory):
    if filename.endswith(extension):
        path = os.path.join(directory, filename)
        base = os.path.join(directory, filename[:len(filename)-len(extension)])
        print base
        new_xls = base + extension
        new_csv = base + '.csv'
        subprocess.call(['C:\\Users\\user\\XlsToCsv.vbs', sheet, new_xls, new_csv])

main(sys.argv[1],sys.argv[2],sys.argv[3])

Не имеет значения, что я пытаюсь, я получаю то же сообщение об ошибке:

 Traceback (most recent call last):
   File "C:/Users/user/Desktop/Work/XlsDir.py", line 16, in <module>
     subprocess.call(NewCommand)
   File "C:\Python27\lib\subprocess.py", line 524, in call
     return Popen(*popenargs, **kwargs).wait()
   File "C:\Python27\lib\subprocess.py", line 711, in __init__
     errread, errwrite)
   File "C:\Python27\lib\subprocess.py", line 948, in _execute_child
     startupinfo)
   WindowsError: [Error 193] %1 er ikke et gyldigt Win32-program

Последняя строка сообщения об ошибке означает, что она не является допустимой программой Win32.

То, что я пробовал до сих пор:

  • Если я запустил файл .vbs из командной строки с правильными аргументами (листом, именем файла .xls и именем файла .csv), тогда он отлично работает.
  • Если я печатаю команды, которые python генерирует и копирует их в командной строке, они работают нормально.
  • Я пробовал все комбинации "\" и "\" в разных путях, и ничего не улучшалось.
  • Я попытался выполнить программы с заменой аргументов sys.argv [i] конкретными аргументами и затем выполнить .py файл из командной строки. Я получаю то же сообщение об ошибке.

Я надеюсь, что некоторые из вас могут мне помочь. Большое спасибо!

Ответ 1

Чтобы разработать лекарство от Ансгара:

Запуск .vbs из командной строки 'works', потому что оболочка связывает расширение .vbs с приложением (например, cscript/wscript; см. ftype, assoc, cscript//E, cescript//S).

subprocess.call() не открывает оболочку, поэтому либо укажите приложение (c|wscript.exe), либо запустите оболочку самостоятельно:

import subprocess

#subprocess.call("notepad") # works

#subprocess.call("dir") # [Error 2] The system cannot find the file specified
                        # no shell, no intrinsics

#subprocess.call("19112944.vbs") # [Error 193] %1 is not a valid Win32 application
                                 # no shell, can't associate .vbs with c|wscript.exe

subprocess.call("cscript 19112944.vbs") # works

subprocess.call("cmd /c 19112944.vbs") # works
                                       # have shell, can associate .vbs with c|wscript.exe

Ответ 2

Попробуйте запустить script с помощью cscript.exe:

subprocess.call(['cscript.exe', 'C:\\Users\\user\\XlsToCsv.vbs', sheet, new_xls, new_csv])