下面是一个示例代码: importthreadingimportsubprocessdefrun_process(cmd):process=subprocess.Popen(cmd,shell=True)process.wait()cmd="python your_script.py"timeout_sec=10thread=threading.Thread(target=run_process,args=(cmd,))thread.start()thread.join(timeout_sec)ifthread.is_alive():thread._stop()...
简单说就是,使用subprocess模块的Popen调用外部程序,如果stdout或stderr参数是 pipe,并且程序输出超过操作系统的 pipe size时,如果使用Popen.wait()方式等待程序结束获取返回值,会导致死锁,程序卡在wait()调用上。 ulimit -a看到的 pipe size 是 4KB,那只是每页的大小,查询得知 linux 默认的pipe size 是 64KB。 看...
通过查询我们机器的信息,可以看到当前linux系统管道的默认大小是4kb(8 * 512b = 4kb),而在第二次调用的时候因为输出的数据明显小于4kb,这才有了第一次卡死,第二次却执行成功的现象。 此外在python的官方文档*中也在wait方法和stderr属性中做了明确的标注: 当 st...
stdin:我们可以看到,结果被储存进了subprocess.PIPE里,实际上,subprocess.PIPE将多个子进程的输入和输出连接在一起,构成管道(pipe),我们也可以利用这个特性,将stdout和stdin一起使用进行连续的输入输出: c1 = subprocess.Popen(["uname","-a"], stdout=subprocess.PIPE) c2 = subprocess.Popen(["wc"],stdin=chil...
原因就是:PIPE本身可容纳的量比较小,所以程序会卡死,所以一大堆内容输出过来的时候,会导致PIPE不足够处理这些内容 实际我的业务需求并不关心程序执行过程中的输出,只要知道最后的执行结果即可,使用上面的 subprocess.Popen 有些冗余,所以我改成了使用 subprocess.run 。修改后的代码: ...
subprocess的诞生是为了替代、整合以前几种旧的创建子进程的方法,能够实现以管道的形式连接子进程的stdin、stdout、stderr,并且子进程会返回一个returncode给父进程。与C语言中的fock实现类似的功能。 Execute a child program in a new process. On POSIX, the class uses os.execvp() like...
process = subprocess.Popen(['command'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) output, error = process.communicate(input='input_data') 复制代码 程序死锁:如果子进程在执行过程中发生死锁,程序可能会卡住。可以尝试使用 timeout 参数设置超时时间,并使用 process.wait(timeout...
2. 执行外部命令 2.1 使用subprocess.run()subprocess.run()是Python 3.5及更高版本引入的函数,用于...
subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) wait_time =...