check_call check_output call和子流程模块中的Popen方法之间的实际区别是什么?

2024-04-29 11:02:06 发布

您现在位置:Python中文网/ 问答频道 /正文

老实说,我只是不明白“非零”状态的行话,无法真正解释在帮助页面上发生了什么或这意味着什么(甚至没有定义)。下面是一些使用python调用其他脚本的示例,其中

subprocess.call subprocess.check_output subprocess.popen

真的不一样吗? 你什么时候会使用这两种方法,这些方法的消除歧义的细节是什么?如果我想要简单的操作系统调用,我应该使用os.system吗?


Tags: 方法脚本示例output定义状态check页面
2条回答

以一些例子来阐述“奥托里拉”的答案。

假设你有一个简短的脚本,你只关心它是否成功*,你只想现在就做,然后等待结果。例如,假设您想向远程计算机发送一个ping。call是您的选择:

res = call(['ping', '127.0.0.1', '-c', '1', '-W', '1'])
# res is 0 if the ping succeeded, non-zero if it failed. 

现在假设你有一个命令,你想假设它会成功,并且会给你一些你想用来做某事的输出。check_output是给你的。也许是一个subversion命令:

svn_output = check_output(['svn', 'info', path_to_my_working_copy])
# svn_output now contains the svn info output. If it failed, an 
# exception is thrown which more easily allows you to give 
# responsibility of that failure to whoever passed us the wrong 
# path_to_my_working_copy.

一般来说,如果您的用例不属于这些类别中的一个,那么您可能最终会使用Popen

一个简单的用例可能是,假设您有一个要启动的守护进程,但随后会与您的python进程一起运行。现在使用Popen

my_proc = Popen(['my-daemon'])

# We're going to go and do something else now, but want to make sure
# my_proc dies when we do.
import atexit
atexit.register(my_proc.kill)

NB:如果使用Popenraw,则必须确保终止进程,可能使用atexit如我所示。

*“非零”退出状态表示进程失败。一个著名的计算机科学引述到Tolstoy是“快乐的过程都是相似的;每一个不快乐的过程都以自己的方式不快乐”,也就是说,只有一个过程是快乐的:返回0。其他的事情都不快乐,但是有很多不快乐的方法。

主要区别在于,虽然^{}是一个非阻塞函数(意味着您可以在不等待调用完成的情况下继续执行程序),但是^{}^{}都是阻塞

另一个区别在于它们返回的内容:

  • ^{}返回一个Popen object
  • ^{}返回^{}属性。
  • ^{}返回命令执行的输出。

方法^{}^{}实际上是使用Popen object阻塞^{}的包装器。 例如,可以通过调用Popen.returncode()来获取^{}属性。

相关问题 更多 >