将Window BAT(批处理)文件转换为Python脚本

3
我有一个包含DOS命令(如REM、MKDIR、ECHO)、运行某些程序以及把所有输出合并到带时间戳的日志文件中的Window .bat文件。我想把它翻译成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.")

我遇到的唯一问题是:当我像运行test.bat一样双击test.py在Windows中运行时,即使所有步骤都完成了,在最后我仍然会得到这个错误警告消息:“无法访问该文件,因为其正在被另一个进程使用”。 你有什么想法吗?

3
等一下,你有一个调用Perl脚本的批处理文件,现在想将其翻译成调用Perl的Python脚本?...真的吗? - Amber
看起来这个例程的核心是用Perl编写的。为什么不全部使用Perl呢? - Ignacio Vazquez-Abrams
这只是一个例子。它可以是Perl、Stata、Matlab或其他任何语言,也可以是它们的组合。 - cinny
1个回答

3
您应该使用 subprocess 模块来调用您的可执行文件。它允许您指定进程的输入和输出句柄,以便将它们引导到您想要的位置。

那部分很容易。其他的呢?日志文件,时间戳呢? - cinny
时间戳可以使用datetime库轻松处理。我在回答中提到的是日志文件;您可以使用标准的open()函数打开它们并将其传递给子进程调用。 - Amber
这是一个相当简短的脚本,您介意提供一些示例代码来详细说明吗? - cinny
3
所有内容都在Python官方文档中,subprocess是较为复杂的模块之一,因此有很多文档说明。 subprocess.Popen(..., stdout=some_open_file_that_i_can_write_to, stderr=subprocess.STDOUT, ...) 的意思是开启一个子进程,并将标准输出重定向到一个可以写入的文件对象,同时将标准错误也合并到标准输出中。 - Ignacio Vazquez-Abrams
好的,我尝试了一下,它有点起作用,但出现了两个有趣的问题:无论我使用子进程附加到日志中什么内容,都会被放在文件末尾,所以即使我写入日志'完成',它也不会在末尾。此外,在Windows资源管理器中双击.py文件运行似乎不起作用。 - cinny
1
前者是因为您需要重新打开文件(再次以附加模式)或使用文件函数来寻找外部程序写入的末尾。后者是因为Windows默认不识别Python脚本。 - Amber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接