【问题标题】:Recover output of 2 python scripts with subprocess使用子进程恢复 2 个 python 脚本的输出
【发布时间】:2016-07-28 13:23:49
【问题描述】:

我正在尝试从另一个脚本同时启动两个 python 脚本。它适用于 subprocess.Popen。但我也想恢复同时启动的这两个脚本的输出。

当我使用 subprocess.check_output 时,我设法恢复了输出,但脚本没有同时启动。

我做了一个简单的例子来说明这个问题。程序 2scripts.py 调用脚本 aa.py 和 bb.py。

aa.py:

import time

delay = 0
t0 = time.time()
print "temps " + str(t0)
print("aa")
while delay < 5 :
    delay = time.time() - t0

bb.py:

import time

delay = 0
t0 = time.time()
print "temps " + str(t0)
print("bb")
while delay < 5 :
    delay = time.time() - t0

这是 2scripts.py 和 subprocess.Popen 的输出:

2scripts.py:

import subprocess

x = subprocess.Popen((["python", "aa.py"]))
y = subprocess.Popen((["python", "bb.py"]))

临时工 1460040113.05 啊 临时工 1460040113.05
bb

还有 2scripts.py 和 subprocess.check_output() 的输出

import subprocess

x = subprocess.check_output((["python", "aa.py"]))
y = subprocess.check_output((["python", "bb.py"]))
print(x)
print(y)

临时工 1460040186.3 啊 临时工 1460040191.31 bb

【问题讨论】:

    标签: python python-2.7 subprocess popen


    【解决方案1】:

    您可以使用multiprocessing.pool 同时运行两者,并且仅在两者都返回结果时打印输出。这样一来,它们同时开始,您就可以得到它们的输出。

    代码:

    import subprocess
    import multiprocessing.pool
    import time
    
    pool = multiprocessing.pool.ThreadPool(2)
    x,y = pool.map(lambda x: x(), [
            lambda: subprocess.check_output((["python", "aa.py"])),
            lambda: subprocess.check_output((["python", "bb.py"]))
        ])
    
    print(x)
    print(y)
    

    输出:

    temps 1460050982.44
    aa
    
    temps 1460050982.44
    bb
    

    【讨论】:

    • @Utopia - 我犯了一个小的复制粘贴错误。已更新。
    【解决方案2】:

    @Ru Hasha 的增强示例,线程数作为第一个命令行参数,只有一个脚本来说明调用的不同命令。

    xscripts.py

    import sys, subprocess, multiprocessing.pool
    
    nb_threads = int(sys.argv[1])
    pool = multiprocessing.pool.ThreadPool(nb_threads)
    
    processes = []
    for i in range(nb_threads):
        processes.append(lambda i=i: subprocess.check_output((["python", "mic.py", "mic" + str(i)])))
    
    outputs = pool.map(lambda x: x(), processes)
    
    for o in outputs:
        print o
    

    mic.py

    import sys, time
    
    sys.stdout.write(sys.argv[1] + " start time\t" + str(time.time()) + '\n')
    time.sleep(2)
    sys.stdout.write(sys.argv[1] + " end time\t" + str(time.time()))
    

    输出

    $ python xscripts.py 4
    mic0 start time 1460071350.1
    mic0 end time   1460071352.1
    mic1 start time 1460071350.1
    mic1 end time   1460071352.1
    mic2 start time 1460071350.1
    mic2 end time   1460071352.1
    mic3 start time 1460071350.1
    mic3 end time   1460071352.1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-30
      • 2015-01-21
      • 1970-01-01
      • 1970-01-01
      • 2015-07-16
      • 2023-03-07
      • 2014-12-17
      • 1970-01-01
      相关资源
      最近更新 更多