2011-11-15 2 views
2

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でやっているように、すべてのステップが最後に完了しても、このエラー警告メッセージが表示されます。

"プロセスは別のプロセスで使用されているため、ファイルにアクセスできません"

+3

待ち時間があるので、perlスクリプトを呼び出すバッチファイルがあり、そのバッチをPerlを呼び出すPythonに変換したいのですか? ... 本当に? – Amber

+0

ルーチンの核心はPerlだと思われます。なぜPerlですべてを作るのではないのですか? –

+0

これは単なる例でした。それは、Perl、Stata、Matlab、またはその他のもの、および/またはすべての組み合わせとすることができます。 – user18115

答えて

3

subprocessモジュールを使用して、実行可能ファイルを呼び出す必要があります。これにより、プロセスの入力ハンドルや出力ハンドルなどを指定できるため、必要な場所に指示することができます。

+0

その部分は簡単な部分です。残りはどう?ログファイル、タイムスタンプ? – user18115

+0

タイムスタンプは 'datetime'ライブラリでかなり簡単に処理できます。私が私の答えで言ったログファイル。それらを標準の 'open()'関数で開き、それをサブプロセス呼び出しに渡します。 – Amber

+0

かなり短いスクリプトなので、いくつかのサンプルコードでもう少し詳しく説明してください。 – user18115

関連する問題