10

I would like to convert dozens of excel sheets to csv files at once. I have a working .vbs file which makes the conversion, and I would like to execute this .vbs file on the different sheets with the help of a python code. I have the following 2 versions of the python code:

Version 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)

Version 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])

It does not matter, which I try, I get the same error message:

 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

The last line of the error message means approximately, that it is not a valid Win32-program.

What I have tried so far:

  • If I run the .vbs file from command prompt with the right arguments (sheet, name of the .xls file and name of the .csv file) then it works fine.
  • If I print the commands that python generates and copy them into command prompt, they work fine.
  • I tried every combinations of '\' and '\' within the different paths, and nothing got any better.
  • I tried to execute the programs with replacing the sys.argv[i] arguments with specific arguments and then execute the .py file from command prompt. I get the same error message.

I hope some of you can help me. Thanks a lot!

2
  • :-) I found the solution after two days. :-) I do not delete my question, perhaps others will need it. You have to add "wscript.exe " to the subprocess.call argument... 'NewCommand="wscript.exe C:\\Users\\user\\XlsToCsv.vbs "+sys.argv[2]+" "+NewXls+NewCsv" Commented Oct 1, 2013 at 10:34
  • Did you try to use different way of running you command like using os.system? Additionally you can look there: stackoverflow.com/questions/5538671/… probably it can help you. Commented Oct 1, 2013 at 10:38

2 Answers 2

18

To elaborate on Ansgar's remedy:

Starting a .vbs from the command line 'works', because the shell associates the extension .vbs with an application (e.g. cscript/wscript; see ftype, assoc, cscript //E, cescript //S).

subprocess.call() does not open a shell, so either specify the application (c|wscript.exe) or start the shell yourself:

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
Sign up to request clarification or add additional context in comments.

3 Comments

Thanks a lot Ekkehard, this was exactly the answer I wanted to get.
Is there a way of executing a vbs file with arguments created by python outside of a command line interface?
In theory you can use comtypes (pypi.python.org/pypi/comtypes) to .CreateObject() a MSScriptControl (msdn.microsoft.com/en-us/library/aa227633(v=vs.60).aspx); .AddCode some VBScript code and .Run it with arguments. In practice it won't work: no download, no support, 32 bit only.
9

Try running the script with cscript.exe:

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

1 Comment

Thanks a lot Ansgar, this really is the solution. :-)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.