Перевести Windows BAT (пакетный) файл в скрипт Python - PullRequest
3 голосов
/ 15 ноября 2011

У меня есть файл Window .bat с командами DOS, которые включают REM, MKDIR, ECHO, запускают некоторые программы и особенно объединяют весь вывод в файл журнала с отметками времени.Я хочу перевести это на Python.

Я пробовал os.system, но это не сработает - он запустит программы, которые мне нужны, но нет способа соединить все операторы, убедившись, что все журналы выводятся в нужный файл.Как я понимаю, каждый раз командная строка вызывается отдельно с использованием os.system.

Пример выдержки:

SET LOG=test.log

DEL /F /Q ..\output\

REM THE LOG STARTS HERE
ECHO test.bat started   >%LOG%
ECHO %DATE%     >>%LOG%
ECHO %TIME%     >>%LOG%

stata/e statascript.do  
matlab -r matlabscript -logfile matlabscript.log -nosplash -minimize -wait
lyx -e pdf2 document >>%LOG% 2>&1
COPY %LOG%+statascript.log+matlabscript.log %LOG%


ECHO test.bat completed >>%LOG%
ECHO %DATE%     >>%LOG%
ECHO %TIME%     >>%LOG%

PAUSE

Мой пример кода:

import subprocess, time, sys, os

log = open('test.log', 'w')

p = subprocess.call(r'DEL /F /Q ..\output\\', shell = True)

log.write('test.py started\n')
log.write(time.asctime())
log.write('\n\n\n')
log.flush()

p = subprocess.call(r'%STATAEXE% /e do statacode.do', shell = True, stdout = log)
log.write(open('statacode.log').read())
p = subprocess.Popen('DEL statacode.log', shell = True, stdout = log)


log.write('\n\ntest.py completed\n')
log.write(time.asctime())
log.write('\n')
log.flush()
log.close()
raw_input("Press <Enter> to exit.")

Единственная проблема, которую я оставил: когда я запускаю это в Windows с помощьюдважды щелкнув test.py так же, как я делаю это с test.bat, я получаю это сообщение об ошибке, даже если все шаги завершены в конце:

"Процесс не может получить доступ к файлу, потому что ониспользуется другим процессом "

Есть идеи?

1 Ответ

3 голосов
/ 15 ноября 2011

Возможно, вам следует использовать модуль subprocess для вызова ваших исполняемых файлов.Он позволяет вам указывать такие вещи, как дескрипторы ввода и вывода для процесса, поэтому вы можете направлять их туда, куда вам нужно.

...