4

Python 2.7 を使用しています。これは、STDOUT と STERR を LOGFILE にリダイレクトして、Python から他のプログラムを起動するために現在行っていることです。

    try:
    # Execute command and print content to LOGFILE
        tempname = os.path.abspath('./text.txt')
        TEMPFILE = open(tempname, 'wb')
        print 'Executing: ', command
        subprocess.check_call(command, shell = True, stdout = TEMPFILE, stderr = TEMPFILE)
        TEMPFILE.close()
        LOGFILE.write(open(tempname, 'rU').read())
        LOGFILE.close()
        os.remove(tempname)
    except Exception as errmsg:
    # If fails then print errors to LOGFILE
        TEMPFILE.close()
        LOGFILE.write(open(tempname, 'rU').read())
        os.remove(tempname)
        print messages.crit_error_bad_command % command, '\n', str(errmsg)
        print >> LOGFILE, messages.crit_error_bad_command % command, '\n', str(errmsg)
        LOGFILE.close() 

まず第一に、上記のスクリプトが最善の解決策であるかどうか確信が持てませんでした。subprocess.check_call 呼び出しが失敗した場合でもログを取得したいので、一時ファイルを使用する必要がありました。上記のスクリプトを改善する方法についてのアイデアがあれば、よろしくお願いします。

さらに、これを変更して、STDOUT と STDERR が通常どおり画面に表示され、ログ ファイルにも表示されるようにします。どうすればいいですか?STDOUT を指定しないと、「エラーが発生しました。[y/n] を続行しますか?」のようなメッセージが表示されることに注意してください。画面に表示され、それに反応することができます。現在、すべてがログに記録されているため、画面には何も表示されません。ここでの私の質問への回答は、このケースの解決に役立つはずです。

ありがとう。

4

1 に答える 1

1

「エラーが発生しました。続行しますか[y/n]」などが表示されます。画面上でそれから私はそれに反応することができます。

サブプロセスのstdoutをリダイレクトし、手動で、または事前定義された回答を使用してプロセスと対話するには、pexpectを使用できます。

from contextlib import closing
import pexpect

with open('text.txt', 'rb') as logfile:
    with closing(pexpect.spawn(command, logfile=logfile)) as child:
        # call here child.expect(), child.sendline(), child.interact(), etc

を使用して同じ機能を実装することは簡単subprocess.Popenではありません。

于 2012-06-28T03:18:34.397 に答える