如何调用外部命令?

如何调用外部命令?

各种方法及各自的优缺点如下:

os 库

system 函数

对于运行简单的 Shell 命令而不去调用外部程序来说是非常好用的:

os.system("命令加参数")

把命令和参数传递给你系统的 Shell 中。

用这个命令的好处在于你可以一次运行好多命令,还可以设置管道来进行重定向等。但是,这要求你手动输入空格等 Shell 字符。

popen 函数

stream = os.popen("命令和参数")

os.stream 差不多,但是它提供了一个链接标准输入/输出的管道,还有其他 3 个 popen 可以调用。可以传递字符串,也可以传递列表,列表就不用担心溢出字符了(escaping characters

subprocess 库

Popen 管道

这个 Popen 是打算用来替代 os.popen 方法的,有点复杂:

subprocess.Popen("echo aaa", shell=True, stdout=PIPE).stdout.read()

而使用 os.popen

os.popen("echo aaa").read()

它的最大优点就是一个类代替了原来 4 个不同的 popen

call 方法

基本用法和 Popen 类参数一致,但是它会等待命令结束后才会返回程序

return_code = subprocess.call("echo aaa", shell=True)

总结

  • OS 模块里也有 C 语言里的 fork/exec/spawn 方法,但是不建议直接使用

  • 需要注意传递到 shell 命令一定要注意参数的安全性

subprocess.Popen("echo %s" % user_input, stdout=PIPE).stdout.read()

如果传入 go die && rm -rf / 会如何。。。

Last updated