我正在尝试从另一个脚本同时启动两个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
答案 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