Tom*_*Tom 7 python subprocess os.system popen
老实说,我只是不理解"非零"状态的术语来真正解释在帮助页面上发生了什么或者意味着什么(甚至没有定义).有哪些使用python来调用其中这些进程的脚本的例子
subprocess.call
subprocess.check_output
subprocess.popen
真的不一样吗?你何时会使用其中任何一种,以及这些方法的消歧细节是什么?如果我想要简单的OS调用,我应该使用os.system吗?
oto*_*las 10
主要的区别是,尽管popen是无阻塞的功能(这意味着你可以继续执行程序,而无需等待调用完成),都call和check_output被封锁.
另一个区别在于它们的回报:
popen返回一个Popen object.call返回returncode属性.check_output 返回命令执行的输出.这些方法call和check_output,实际上,阻塞的包装popen,使用Popen object.例如,您可以returncode通过调用获取属性Popen.returncode().
dap*_*azz 10
通过一些例子扩展@ otorrillas的答案.
假设您有一个简短的脚本,您只关心它是否成功*,您只想现在就做并等待结果.例如,假设您要将一个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.
Run Code Online (Sandbox Code Playgroud)
现在说你有一个你想要假设的命令会成功,并且会给你一些你想用来做某事的输出.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.
Run Code Online (Sandbox Code Playgroud)
一般来说,如果您的用例不仅仅属于其中一个类别,那么您可能最终会使用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)
Run Code Online (Sandbox Code Playgroud)
注意:如果您使用Popenraw,您必须确保终止该过程,可能使用atexit我所说明的.
*"非零"退出状态仅表示流程失败.一个着名的计算机科学引用归因于托尔斯泰是"快乐的过程都是相似的;每个不愉快的过程都以自己的方式不开心",即只有一种方法让一个过程快乐:返回0.其他一切都不快乐,但那里有很多方法可以不开心.
| 归档时间: |
|
| 查看次数: |
6621 次 |
| 最近记录: |