我正在推出一个使用的程序 subprocess.Popen(cmd, shell=TRUE)
我对Python很新,但感觉就像应该有一些api让我做类似的事情:
subprocess.Popen(cmd, shell=TRUE, postexec_fn=function_to_call_on_exit)
Run Code Online (Sandbox Code Playgroud)
我这样做是为了function_to_call_on_exit能够在知道cmd退出的基础上做一些事情(例如保持当前正在运行的外部进程数的计数)
我假设我可以相当简单地将子进程包装在一个将线程与Popen.wait()方法结合起来的类中,但是因为我还没有在Python中进行线程化,而且看起来这可能是一个常见的API存在,我想我会先尝试找一个.
提前致谢 :)
如何使用线程和子进程模块生成并行bash进程?当我启动线程时,第一个答案就在这里:如何在Python中使用线程?,bash进程按顺序而不是并行运行.
如果我echo a; echo b在bash中运行,结果将是两个命令都运行.但是,如果我使用subprocess,则运行第一个命令,打印出整个行的其余部分.下面的代码是echos a; echo b而不是a b,如何让它运行这两个命令?
import subprocess, shlex
def subprocess_cmd(command):
process = subprocess.Popen(shlex.split(command), stdout=subprocess.PIPE)
proc_stdout = process.communicate()[0].strip()
print proc_stdout
subprocess_cmd("echo a; echo b")
Run Code Online (Sandbox Code Playgroud) 我希望能够并行运行多个进程,并且能够随时使用stdout.我该怎么办?我是否需要为每个subprocess.Popen()呼叫运行线程,什么?
我理解使用subprocess是调用外部命令的首选方式.
但是如果我想在parall中运行几个命令,但是限制生成的进程数呢?困扰我的是我无法阻止子进程.例如,如果我打电话
subprocess.Popen(cmd, stderr=outputfile, stdout=outputfile)
Run Code Online (Sandbox Code Playgroud)
然后该过程将继续,无需等待cmd完成.因此,我无法将其包装在multiprocessing图书馆的工作人员中.
例如,如果我这样做:
def worker(cmd):
subprocess.Popen(cmd, stderr=outputfile, stdout=outputfile);
pool = Pool( processes = 10 );
results =[pool.apply_async(worker, [cmd]) for cmd in cmd_list];
ans = [res.get() for res in results];
Run Code Online (Sandbox Code Playgroud)
然后每个工人将在产生子流程后完成并返回.所以我无法真正限制subprocess使用生成的进程数Pool.
什么是限制子过程数量的正确方法?
当调用通过Python subprocess模块花费相对较长时间的linux二进制文件时,这会释放GIL吗?
我想并行化一些从命令行调用二进制程序的代码.是否更好地使用线程(通过threading和a multiprocessing.pool.ThreadPool)或multiprocessing?我的假设是,如果subprocess发布GIL,那么选择该threading选项会更好.
假设我有这样一个类:
class MyClass:
def __init__(self):
run_some_long_time_function()
Run Code Online (Sandbox Code Playgroud)
如何在python 3.4.1中使用asyncio并行创建此类的多个实例?
我试图找出如何以非阻塞方式简单地启动一些长时间运行的shell命令,并按照它们完成的顺序异步处理它们的输出,即使这是另一个订单而不是它们开始,使用Python 3.4中提供的asyncio python库并转发.
我正在研究当前的玩具代码,试图理解asyncio模块.
import asyncio
import os, sys, traceback
from time import time
os.environ['PYTHONASYNCIODEBUG'] = '1'
print(sys.version)
def timed_fib(n):
def fib(n):
return fib(n - 1) + fib(n - 2) if n > 1 else n
a = time()
return fib(n), time() - a
def process_input():
text = sys.stdin.readline()
n = int(text.strip())
print('fib({}) = {}'.format(n, timed_fib(n)))
@asyncio.coroutine
def print_hello():
while True:
print("{} - Hello world!".format(int(time())))
yield from asyncio.sleep(3)
def main():
loop = asyncio.get_event_loop()
loop.add_reader(sys.stdin, process_input)
loop.run_until_complete(print_hello())
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud)
然而,尝试运行它会产生下面令人难以置信的神秘回溯.如您所见,调试环境变量在上面代码的第五行中设置,但是,回溯仍然非常无益,如下所示:
3.4.3rc1 …Run Code Online (Sandbox Code Playgroud) 我希望并行运行两个可执行文件 a.exe 和 b.exe,依次调用。
当我尝试时,
os.system('a.exe')
#some code
os.system('b.exe')
Run Code Online (Sandbox Code Playgroud)
b.exe 在我杀死 a.exe 后才开始启动?为什么会发生这种情况?我怎样才能同时运行两者?(需要多线程吗?) 注:我是Windows平台
python ×10
subprocess ×8
bash ×1
callback ×1
exit ×1
gil ×1
python-2.7 ×1
python-3.x ×1
windows ×1