如何在Python脚本中运行bash命令

24
我想在一个bash脚本中运行Python和bash命令。 在这个脚本中,我希望能够执行一些用Python循环括起来的bash命令。
#!/bin/bash

python << END
for i in range(1000):
    #execute‬ some bash command such as echoing i
END

我该怎么做?

3个回答

41

使用 subprocess 模块,例如:

import subprocess
# ...

subprocess.call(["echo", i])

还有一个与subprocess.call类似的函数:subprocess.check_call。它与call完全相同,只是当执行的命令返回非零退出码时,它会抛出异常。在脚本和实用程序中,这种行为通常是可行的。

subprocess.check_output的行为与check_call相同,但返回程序的标准输出。


如果您不需要shell特性(例如变量扩展、通配符等),永远不要使用shell=True(shell=False是默认设置)。如果您使用shell=True,则应该自己处理这些函数的shell转义,并且如果传递未经验证的用户输入,则存在安全漏洞。

os.system()也是如此——它经常是安全问题的来源。不要使用它。


9
为什么不推荐使用import os?为什么不推荐使用import os? - Luis Ramon Ramirez Rodriguez
@LuisRamonRamirezRodriguez,“os.system()”提供的控制比“subprocess.Popen”接口少得多 - 最重要的是,它没有提供从代码传递数据的方法(或提供文字argv数组),这使得很难避免shell注入漏洞。 - Charles Duffy
1
@dom0,shell=True对你的subprocess.call(["echo", i], shell=True)示例来说是错误的:运行的shell脚本只是echo,没有参数,并且i作为参数传递给脚本不引用的shell。 - Charles Duffy
我编辑了答案,以首先提出安全的方式。 - dom0

18

查看子进程模块。其中有Popen方法和一些包装函数,如call

  • 如果您需要检查输出(检索结果字符串):

    output = subprocess.check_output(args ....)
    
  • 如果您想要在继续之前等待执行结束:

    exitcode = subprocess.call(args ....)
    
  • 如果您需要更多功能,例如设置环境变量,请使用底层的Popen构造函数:

    subprocess.Popen(args ...)
    

记得 subprocess 是更高级的模块。它应该替换操作系统模块中的传统函数。


1

我在使用我的IDE(PyCharm)运行时使用了这个。

import subprocess

subprocess.check_call('mybashcommand', shell=True)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接