1

私はPythonコマンドラインプログラムを書いています。

エントリ ポイントとして機能するメインの Python スクリプト ファイルがあります。ユーザーがこのスクリプトを実行すると、いくつかの外部 Python スクリプト ファイルが実行されます。外部 Python スクリプト ファイルは、他の外部 Python スクリプト ファイルを実行することもできます。外部ファイルの数は可変です。

Python スクリプトは、以下を使用して外部 Python スクリプトを実行します。

p = subprocess.Popen(args)

or

p = subprocess.call(args)

ターミナル ウィンドウでメインの Python スクリプトを実行すると、実行中の画面にリアルタイムのログ メッセージが出力されます。ここで、メインの Python スクリプトによって呼び出されたすべての外部 Python スクリプトからすべてのログ メッセージを取得し、それを同じターミナル ウィンドウ (メイン スクリプトの実行に使用するターミナル ウィンドウ) に出力したいと考えています。

たとえば、以下はスクリプト実行のシーケンスです。

1.Main-script
    |
    2.Layer-1-script-1
        |
        3.Layer-2-script-1
        |
        4.Layer-2-script-2
        |
    5.Layer-1-script-2
    |
    6.Layer-1-script-3
    |
7.Main-script(continued)

ターミナル ウィンドウでメイン スクリプトを実行すると、以下のようにターミナル ウィンドウでリアルタイムのログ メッセージを取得できますか?

[time-hh-mm-ss][log message from main script]Script is running..
[time-hh-mm-ss][log message from main script]Calling script layer-1-script-1..
[time-hh-mm-ss][log message from layer-1-script-1]Script is running..
[time-hh-mm-ss][log message from layer-1-script-1]Calling script layer-2-script-1..
[time-hh-mm-ss][log message from layer-2-script-1]Script is running..
[time-hh-mm-ss][log message from layer-2-script-1]Calling script layer-2-script-2..
[time-hh-mm-ss][log message from layer-2-script-2]Script is running..
[time-hh-mm-ss][log message from layer-2-script-2]Calling script layer-1-script-2..
[time-hh-mm-ss][log message from layer-1-script-2]Script is running..
[time-hh-mm-ss][log message from layer-1-script-2]Calling script layer-1-script-3..
[time-hh-mm-ss][log message from layer-2-script-3]Script is running..
[time-hh-mm-ss][log message from main script]Back to main script. Script is running..

real time log messages端末ウィンドウで上記のようなものを取得できる可能性はありますか?

4

2 に答える 2

0

モジュールに依存している場合は、サブプロセスから標準出力と標準エラーを収集するために ssubprocess経由でのみ通信できます。subprocess.PIPEしたがって、サブプロセスのログ出力を stdout/err に書き込み、パイプを介してサブプロセスを親プロセスに接続します。そうすることで、基本的にサブプロセスの標準出力を親プロセスの標準出力に出力することができます。

于 2012-09-13T15:05:48.980 に答える
0

すべての Python スクリプトを制御できる場合は、 whichmultiprocessingの代わりに次のsubprocessようなことを行うことができます。

test.py :

import logging
import test2
import multiprocessing as mp

logger = mp.get_logger()

def main():
    logger.info('Script is running')
    logger.info('Calling script test2')
    proc = mp.Process(target = test2.main)
    proc.start()
    proc.join()

if __name__ == '__main__':
    formatter = logging.Formatter('[%(asctime)s] [%(filename)s]: %(message)s',
                                  datefmt = '%H:%M:%S')
    handler = logging.StreamHandler()
    handler.setFormatter(formatter)
    logger.addHandler(handler)
    logger.setLevel(logging.INFO)    
    main()

test2.py:

import multiprocessing as mp

logger = mp.get_logger()

def main():
    logger.info('Script is running...')

歩留まりtest.py_

[11:36:50] [test.py]: Script is running
[11:36:50] [test.py]: Calling script test2
[11:36:50] [util.py]: child process calling self.run()
[11:36:50] [test2.py]: Script is running...
[11:36:50] [util.py]: process shutting down
[11:36:50] [util.py]: process exiting with exitcode 0
[11:36:50] [util.py]: process shutting down
于 2012-09-13T15:07:09.797 に答える