2013-10-01 3 views
1

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

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) 

Версия 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-файл из командной строки. Я получаю то же сообщение об ошибке.

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

+0

:-) Я нашел решение через два дня. :-) Я не удаляю свой вопрос, возможно, другим это понадобится. Вы должны добавить «wscript.exe» в аргумент subprocess.call ... «NewCommand =» wscript.exe C: \\ Users \\ user \\ XlsToCsv.vbs "+ sys.argv [2] +" "+ NewXls + NewCsv " – Rieux

+0

Вы пытались использовать другой способ выполнения команды, например, используя' os.system'? Кроме того, вы можете посмотреть там: http://stackoverflow.com/questions/5538671/python-call-to-external- program-results-in-error-193-1-is-not-a-valid-win32-возможно, это может вам помочь. – user2725093

ответ

4

Выработать на лекарства Ansgar в:

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

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

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 
+0

Большое спасибо Ekkehard, это был именно тот ответ, который я хотел получить. – Rieux

+0

Есть ли способ выполнить файл vbs с аргументами, созданными python за пределами интерфейса командной строки? – Mitrek

+0

В теории вы можете использовать comtypes (https://pypi.python.org/ pypi/comtypes) в .CreateObject() MSScriptControl (https://msdn.microsoft.com/en-us/library/aa227633(v=vs.60).aspx); .AddCode некоторый код VBScript и. Запустите его с аргументами.На практике это не сработает: нет загрузки, нет поддержки, только 32 бит. –

2

Попробуйте запустить сценарий с cscript.exe:

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

Большое спасибо Ansgar, это действительно решение. :-) – Rieux

Смежные вопросы