使用子进程恢复2个python脚本的输出

时间:2016-04-07 14:57:22

标签: python python-2.7 subprocess popen

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

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

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

aa.py:

 $link = str_replace('" rel="next">', '" onclick="ga(\'send\', \'event\', \'NavNext\', \'click\');" rel="next">', $link);

bb.py:

import time

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

这是2scripts.py和subprocess.Popen:

的输出

2scripts.py:

import time

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

temps 1460040113.05   AA   temps 1460040113.05
  BB

2scripts.py和subprocess.check_output()

的输出
import subprocess

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

temps 1460040186.3   AA   temps 1460040191.31   BB

2 个答案:

答案 0 :(得分:0)

您可以使用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

答案 1 :(得分:0)

@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