调用系统命令的不同方法

时间:2017-12-10 03:51:07

标签: python python-3.x operating-system exec

在搜索如何调用系统命令时,我发现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特别推荐哪些。有两种版本的方法吗?

1 个答案:

答案 0 :(得分:1)

  

简答:使用子流程模块

根据您的需要(输入,输出,管道)应该使用来自subprocess的任何风味,但os.systemos.popen绝对是replaced并且不应该&不再使用了。

subprocess.check_outputsubprocess.Popen的包装器,与其他兄弟命令subprocess.callcheck_call一样,只返回命令的输出,但不管理任何命令通信。

subprocess.Popen是基本方法,它用于执行更复杂的过程通信,如单向/双向和PIPE重定向。

shell_command是一个简化shell交互的软件包,它基于subprocess.Popen。如果您没有进行大量系统管理工作,则无需使用它。

那么,您如何选择所需的subprocess电话?

  

1)不需要shell交互,只需要Fire和Forget?

subprocess.callos.systemos.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.callsubprocess.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 .. :)