如何在Python脚本中运行bash命令
我试图在bash脚本中运行Python和bash命令。 在bash脚本中,我想执行一些由Python循环包围的bash命令:如何在Python脚本中运行bash命令,python,bash,Python,Bash,我试图在bash脚本中运行Python和bash命令。 在bash脚本中,我想执行一些由Python循环包围的bash命令: #!/bin/bash python << END for i in range(1000): #execute some bash command such as echoing i END #/bin/bash python使用,例如: 还有另一个函数类似于子流程.call:子流程.check\u call。这与调用完全相同,只是如果执行的命
#!/bin/bash
python << END
for i in range(1000):
#execute some bash command such as echoing i
END
#/bin/bash
python使用,例如:
还有另一个函数类似于子流程.call
:子流程.check\u call
。这与调用完全相同,只是如果执行的命令返回非零退出代码,它会引发异常。在脚本和实用程序中,这通常是可行的行为
subprocess.check\u output
的行为与check\u call
相同,但返回程序的标准输出
如果不需要shell功能(如变量扩展、通配符等),请不要使用shell=True(默认为shell=False)。如果使用shell=True,则shell转义是这些函数的工作,如果传递未经验证的用户输入,则它们是一个安全漏洞
os.system()也是如此——它是安全问题的常见来源。不要使用它。查看模块。有Popen方法和一些包装函数,如call
- 如果需要检查输出(检索结果字符串):
- 如果要在继续之前等待执行结束:
exitcode = subprocess.call(args ....)
- 如果您需要设置环境变量等更多功能,请使用底层Popen构造函数:
subprocess.Popen(args ...)
请记住,子流程是更高级别的模块。它应该取代操作系统模块中的旧功能。我在从IDE(PyCharm)运行时使用了它
为什么不建议使用导入操作系统?@LuisRamonRamirezRodriguez,os.system()
提供的控制比subprocess.Popen
接口提供的控制要少——最重要的是,它无法从代码中传递带外数据(或提供文字argv数组),这使得很难避免shell注入漏洞。@dom0,shell=True
对于您的子流程来说是错误的。调用([“echo”,i],shell=True)
示例:运行的shell脚本只是echo
,没有参数,i
作为参数传递给脚本未引用的shell。我编辑了答案,以便首先提出安全方法。
exitcode = subprocess.call(args ....)
subprocess.Popen(args ...)
import subprocess
subprocess.check_call('mybashcommand', shell=True)