我的python脚本(python 3.4.3)通过子进程调用bash脚本:
import subprocess as sp
res = sp.check_output("bashscript", shell=True)
该 bashscript 包含以下行:
ssh -MNf somehost
这将打开与某个远程主机的共享主连接,以允许进行一些后续操作。
执行python脚本时,它将提示输入该ssh
行的密码,但是在输入密码后它将阻塞,并且永远不会返回。当我按ctrl-
C终止脚本时,我看到连接已正确建立(因此ssh
行已成功执行)。
使用check_call
代替时check_output
,我没有此阻塞问题,但check_call
不检索标准输出。我想了解到底是什么导致了阻止行为check_output
,可能与的一些微妙之处有关ssh -MNf
。
check_call()``/bin/sh
进程退出后立即返回,而无需等待后代进程(假设shell=True
与您的情况相同)。
check_output()
等待直到读取所有输出。如果ssh
继承管道,则check_output()
它将等待直到退出(直到关闭其继承的管道末端)。
check_call()
代码示例:
#!/usr/bin/env python
import subprocess
import sys
import time
start = time.time()
cmd = sys.executable + " -c 'import time; time.sleep(2)' &"
subprocess.check_call(cmd, shell=True)
assert (time.time() - start) < 1
不读取输出;check_call()
立即返回,而无需等待孙子后台python进程。
check_call()
就是Popen().wait()
。Popen()
启动外部进程并立即返回,而无需等待其退出。.wait()
收集进程的退出状态-
它不等待其他(孙代)进程。
如果读取了输出(重定向并孙子python进程继承了stdout管道):
start = time.time()
subprocess.check_output(cmd, shell=True)
assert (time.time() - start) > 2
然后等待直到继承管道的后台python进程退出。
check_output()
调用Popen().communicate()
,以获取输出。内部.communicate()
调用,.wait()
即check_output()
也等待外壳退出并check_output()
等待EOF。
如果孙子不继承管道,则check_output()
不要等待它:
start = time.time()
cmd = sys.executable + " -c 'import time; time.sleep(2)' >/dev/null &"
subprocess.check_output(cmd, shell=True)
assert (time.time() - start) < 1
孙子的输出被重定向到/dev/null
即不继承父管道的输出,因此check_output()
可以不等待而退出。
注意:&
最后将孙子python进程置于后台。在默认情况下shell=True
启动cmd.exe
的Windows上,它将无法使用。
问题内容: 我有以下脚本: 我从打来电话: 而且效果很好。 但是,当我这样做时: 口译员挂了。我究竟做错了什么?我希望能够多次读写另一个进程,以将一些任务传递给该进程。我需要做些什么? 编辑1 如果使用,则会得到以下信息: 编辑2 我试过冲洗: 和这里: 但它再次挂起。 问题答案: 我相信这里有两个问题在起作用: 1)您的父脚本调用,它将读取所有数据,直到文件结束。但是,您的子脚本会无限循环运行,
我对xargs的性能可伸缩性有一个问题。目前,我有一个用python编写的批处理程序,带有多处理和子进程。每个进程产生一个独立的子进程。popen()执行外部命令。最近我意识到整个过程可以用xargs重做。然而,我想知道使用xargs处理10k文件是否是一个好主意,因为我以前从未用命令行工具做过如此大规模的事情。考虑到我对小数据集的测试,如果我所做的只是批量运行一组命令,这其实不是一个坏主意,因为
问题内容: 我正在Python 2.6的GUI前端上工作,通常它非常简单:您使用或发出命令,然后等待命令完成或对错误做出反应。如果您有一个程序停止并等待用户交互,该怎么办?例如,程序可能会停止并要求用户提供ID和密码或如何处理错误? 到目前为止,我所阅读的所有内容都告诉您如何仅 在 程序完成 后 读取程序的所有输出,而不是如何在程序仍在运行时处理输出。我无法安装新模块(这是针对LiveCD的),并
我正在试图理解如何为多个子进程构建并行计算管道。正如我所看到的,每个子进程块等待前一个代码块运行,而我有一个管道,它对前一个运行没有依赖关系,并且可以并行处理。我想知道这是不是可能的,如果是这样的话,一个示例语法来展示如何做到这一点将是一个很大的帮助!提前道谢。
问题内容: 我正在使用python脚本作为水动力代码的驱动程序。是时候运行模拟了,我用来运行代码,将和的输出收集到中,然后我可以打印(并保存到日志文件中)输出信息,并检查是否有错误。问题是,我不知道代码是如何进行的。如果我直接从命令行运行它,它将为我提供有关其迭代次数,时间,下一时间步长等的输出。 有没有办法既存储输出(用于日志记录和错误检查),又产生实时流输出? 我的代码的相关部分: 最初,我是
简明的 我是raspberry pi的初学者,目前正在从事一个项目,该项目需要在启动时运行python脚本。 脚本的一部分将检查某些条件,然后在必要时打开chroum-浏览器(使用子进程。Popen())。 代码 下面是我的python脚本的简短摘录(睡眠是为了检查脚本是否正在运行): 当我从终端运行时,代码似乎正确执行: 但是,当我尝试在crontab上安排它时(使用终端使用“sudo cron