REM、MKDIR、ECHOを含むDOSコマンドを含むウィンドウ.batファイルがあり、いくつかのプログラムを実行し、特にすべての出力をタイムスタンプ付きのログファイルにまとめます。私はこれをPythonに翻訳したいと思います。ウィンドウの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.pyをダブルクリックして、Windowsでこれを実行するとtest.batでやっているように、すべてのステップが最後に完了しても、このエラー警告メッセージが表示されます。
"プロセスは別のプロセスで使用されているため、ファイルにアクセスできません"
待ち時間があるので、perlスクリプトを呼び出すバッチファイルがあり、そのバッチをPerlを呼び出すPythonに変換したいのですか? ... 本当に? – Amber
ルーチンの核心はPerlだと思われます。なぜPerlですべてを作るのではないのですか? –
これは単なる例でした。それは、Perl、Stata、Matlab、またはその他のもの、および/またはすべての組み合わせとすることができます。 – user18115