1

以下のように、main.py と infinit.py の 2 つのファイルがあります。

main.py

#!/usr/bin/python

import logging
import subprocess
import sys

logging.basicConfig(level=logging.INFO)


def forever():
    cmd = [sys.executable, 'infinit.py']
    while 1:
        try:
            print 'running new instance of:'
            print ' '.join(cmd)
            popen = subprocess.Popen(cmd, stdout=subprocess.PIPE,
                stderr=subprocess.PIPE, universal_newlines=True)

            for line in iter(popen.stderr.readline, ""):
                print line,
            for line in iter(popen.stdout.readline, ""):
                print line,

        except Exception as e:
            print 'Something bad happend'
            logging.error(e)


if __name__ == '__main__':
    forever()

infinit.py

#!/usr/bin/python

import logging

logging.basicConfig(level=logging.INFO)

i = 0
while 1:
    i += 1
    logging.info('i: {0}'.format(i))
    print i

main.py を実行し、両方 (印刷とロギング) をコンソールに表示したいと考えています。また、Windows と Linux で実行したいと考えています。さらに、Windows Idle で動作 (印刷とログ記録) することは可能ですか?

4

2 に答える 2

0

2 つの解決策を見つけました。どちらも Linux と Windows、さらには Windows Idle でも動作するはずです。

  1. より簡単:

親プロセスで、子の stderr を出力します。

#!/usr/bin/python

import logging
import subprocess
import sys

def forever():
    cmd = [sys.executable, 'infinit.py']
    while 1:
        try:
            print 'running new instance of:'
            print ' '.join(cmd)
            popen = subprocess.Popen(cmd, stdout=subprocess.PIPE,
                stderr=subprocess.PIPE, universal_newlines=True)

            for line in iter(popen.stderr.readline, ""):
                print line,

        except Exception as e:
            print 'Something bad happend'
            logging.error(e)

if __name__ == '__main__':
    forever()

今のところ:

  • 親は子のログを出力します (デフォルトでは、ログは出力している stderr と stderr にメッセージを送信するため)
  • 親は子の印刷物を印刷しないため、次のようになります。

infinit.py

#!/usr/bin/python

import logging
import sys
import time

logging.basicConfig(level=logging.INFO)

sys.stdout = sys.stderr

i = 0
while 1:
    i += 1
    logging.info('i: {0}'.format(i))
    print i
    time.sleep(0.2)
  1. 別のアプローチはここにありました:

実行中のサブプロセスの stdout のインターセプト

そして、私のコードはソリューションに適応しました

main.py

#!/usr/bin/python

import logging
import subprocess
import sys

def forever():
    CMD = [sys.executable, 'infinit.py']
    while 1:
        try:
            print 'running new instance of:'
            print ' '.join(CMD)

            popen = subprocess.Popen(CMD, stdout=subprocess.PIPE)
            for line in iter(popen.stdout.readline, ""):
                print line,

        except Exception as e:
            print 'Something bad happend'
            logging.error(e)
        finally:
            print


if __name__ == '__main__':
    forever()

inifinit.py

#!/usr/bin/python

import logging
import sys
import time


class FlushFile(object):
    """Write-only flushing wrapper for file-type objects."""
    def __init__(self, f):
        self.f = f
    def write(self, x):
        self.f.write(x)
        self.f.flush()

logging.basicConfig(level=logging.INFO)

sys.stdout = FlushFile(sys.stdout)


i = 0
while 1:
    i += 1
    logging.info('i: {0}'.format(i))
    print i
    time.sleep(0.2)
于 2012-10-30T14:04:09.887 に答える
0

プログラムの開始時にこの行を追加し、同じ LOG_FILENAME を入力すると、tail -f unix コマンドを使用して出力を確認できます。

import logging
logging.basicConfig(filename=LOG_FILENAME,level=logging.DEBUG, filemode = 'w+')
logging.getLogger().setLevel(logging.DEBUG)
于 2012-10-29T16:45:39.690 に答える