在搜索如何调用系统命令时,我发现Python中有许多方法。如何在调用系统命令的不同方法之间进行选择:
方法1:
os.system('ls -l *.py')
方法2:
os.popen("ls -l").read()
方法3:
subprocess.check_output(["ls", "-l", "*.py"]);
方法4:
p = subprocess.Popen("ls -l *.py", stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True, shell=True)
(out, err) = p.communicate()
方法5:
from shell_command import shell_call
shell_call("ls -l *.py")
每个的相对优势和劣势是什么? python3与python2特别推荐哪些。有两种版本的方法吗?
答案 0 :(得分:1)
简答:使用子流程模块
根据您的需要(输入,输出,管道)应该使用来自subprocess
的任何风味,但os.system
和os.popen
绝对是replaced并且不应该&不再使用了。
subprocess.check_output
是subprocess.Popen
的包装器,与其他兄弟命令subprocess.call
和check_call
一样,只返回命令的输出,但不管理任何命令通信。
subprocess.Popen
是基本方法,它用于执行更复杂的过程通信,如单向/双向和PIPE重定向。
shell_command
是一个简化shell交互的软件包,它基于subprocess.Popen
。如果您没有进行大量系统管理工作,则无需使用它。
那么,您如何选择所需的subprocess
电话?
1)不需要shell交互,只需要Fire和Forget?
subprocess.call
是os.system
和os.call
的直接替代品。你打电话给它并且不关心输出。命令行参数作为list of strings
或单string
传递(仅限shell = True模式),这使您免于转义引号或特殊字符的负担。
示例:强>
subprocess.call(['ls', '-l'])
返回值是应用程序本身的退出代码,如果您想知道外部命令是否崩溃/成功或任何其他退出命令,您必须自己处理它。
1a)您需要自动错误处理
如果你想让python处理错误处理,可以使用一个方便的函数subprocess.check_call
,它与subprocess.call
相同,但如果进程返回任何异常,它会引发CalledProcessError
异常其他错误值不是0
。
try:
subprocess.check_call(['false'])
except subprocess.CalledProcessError as err:
print 'Error:', err
2)对外部命令的输出感兴趣吗?
subprocess.call
和subprocess.check_call
绑定到父程序的输出,因此无法捕获命令的输出。 subprocess.check_output
是捕获命令输出的命令。
示例:
output = subprocess.check_output(['ls', '-l'])
print output
total 941234
drwxr-xr-x 28 user staff 1972 Dec 9 11:24 test.cpp
-rw-r--r-- 1 user staff 799 Jan 1 09:12 out
3)与您的流程沟通?
仍在写......它将会是关于POPEN .. :)