Python sp=subprocess.Popen()的优点-->;sp.communicate()与subprocess.call()的比较

Python sp=subprocess.Popen()的优点-->;sp.communicate()与subprocess.call()的比较,python,scripting,sysadmin,Python,Scripting,Sysadmin,大约4个月前,我写了一个我经常使用的func,我记不起为什么我会这样分割东西: def call_sp(command, **arg_list): #run that beast p = subprocess.Popen(command, shell=True, **arg_list) p.communicate() 我阅读了子流程上的文档,看到call()基本上做了相同的事情。不记得那天发生了什么,除了上面的func和subprocess.call([“mycomma

大约4个月前,我写了一个我经常使用的func,我记不起为什么我会这样分割东西:

def call_sp(command, **arg_list):
    #run that beast
    p = subprocess.Popen(command, shell=True, **arg_list)
    p.communicate()
我阅读了子流程上的文档,看到call()基本上做了相同的事情。不记得那天发生了什么,除了上面的func和subprocess.call([“mycommand”]),还有python系统管理员知道在使用上有什么有意义的区别吗?我看到我的func没有返回任何退出状态,正在检查命令是否有效是call()的唯一区别/优势吗?这是我今天看到的

In [4]: subprocess.call(['echo $HOME'], shell=True)
/home/cchilders
Out[4]: 0

In [5]: %paste
def call_sp(command, **arg_list):
    #run that beast
    p = subprocess.Popen(command, shell=True, **arg_list)
    p.communicate()

## -- End pasted text --


In [6]: call_sp('echo $HOME')
/home/cchilders

感谢

调用
Popen
典型用例的一个方便功能。在本例中,使用它比使用
Popen
构造函数更简单,因为您没有使用已执行命令的输出

如果需要与正在运行的子进程交换一些数据,或者需要进一步处理命令输出(stdout、stderr)
Popen
communicate


如果您对调用的成功感兴趣,那么还有另一个便利函数
check\u call
,如果执行的进程以非零状态退出,它将引发异常。

call
Popen
的典型用例的便利函数。在本例中,使用它比使用
Popen
构造函数更简单,因为您没有使用已执行命令的输出

如果需要与正在运行的子进程交换一些数据,或者需要进一步处理命令输出(stdout、stderr)
Popen
communicate


如果您对调用的成功感兴趣,那么还有另一个便利函数
check\u call
,如果执行的进程以非零状态退出,它将引发异常。

call
Popen
的典型用例的便利函数。在本例中,使用它比使用
Popen
构造函数更简单,因为您没有使用已执行命令的输出

如果需要与正在运行的子进程交换一些数据,或者需要进一步处理命令输出(stdout、stderr)
Popen
communicate


如果您对调用的成功感兴趣,那么还有另一个便利函数
check\u call
,如果执行的进程以非零状态退出,它将引发异常。

call
Popen
的典型用例的便利函数。在本例中,使用它比使用
Popen
构造函数更简单,因为您没有使用已执行命令的输出

如果需要与正在运行的子进程交换一些数据,或者需要进一步处理命令输出(stdout、stderr)
Popen
communicate

如果您对调用的成功感兴趣,那么还有另一个方便的函数
check\u call
,如果执行的进程以非零状态退出,它将引发异常。

子进程。call(…)
本质上是
Popen(…)。wait()
不同于
Popen(…)。communicate()
如果重定向子进程的任何标准流,例如,
stdout=PIPE
或者如果需要退出状态

是一个方便的函数,它构建在
Popen()
提供的接口之上。如果
call()
适用于您的情况;使用它。如果它不起作用;考虑其他方便函数,如:代码>子进程.CHECKOUTPUTPUTE()/代码>,然后直接使用<代码> PONEN()/<代码> .< /P> 一般来说,编写一个方便的函数在您的案例中工作是一个好主意(尽管您的特定示例不太有用)
Popen()
可以做很多事情,一个限制其功能的方便函数使代码更易于维护

不要调用
p.communicate()
,除非需要传递输入,否则从子流程获取输出。不要使用
shell=True
,除非您完全控制
命令
参数。

子进程。调用(…)
本质上是
Popen(…)。wait()
Popen(…)不同。如果重定向子进程的任何标准流,例如。,
stdout=PIPE
或者如果需要退出状态

是一个方便的函数,它构建在
Popen()
提供的接口之上。如果
call()
适用于您的情况;使用它。如果它不起作用;考虑其他方便函数,如:代码>子进程.CHECKOUTPUTPUTE()/代码>,然后直接使用<代码> PONEN()/<代码> .< /P> 一般来说,编写一个方便的函数在您的案例中工作是一个好主意(尽管您的特定示例不太有用)
Popen()
可以做很多事情,一个限制其功能的方便函数使代码更易于维护

不要调用
p.communicate()
,除非需要传递输入,否则从子流程获取输出。不要使用
shell=True
,除非您完全控制
命令
参数。

子进程。调用(…)
本质上是
Popen(…)。wait()
Popen(…)不同。如果重定向子进程的任何标准流,例如。,
stdout=PIPE
或者如果需要退出状态

是一个方便的函数,它构建在
Popen()
提供的接口之上。如果
call()
适用于您的情况;使用它。如果它不起作用;考虑其他方便函数,如:代码>子进程.CHECKOUTPUTPUTE()/代码>,然后直接使用<代码> PONEN()/<代码> .< /P> 编写一个在y中工作的便利函数