python echo命令_如何用Python调用外部命令
解決方法
方法1:我們可以使用subprocess,比如要執行 ls -l 命令
import subprocess
subprocess.run("ls", "-l")
Python3.5 之前的版本,需要使用 call
import subprocess
subprocess.call(["ls", "-l"])
方法2:
import os
os.system("ls -l")
os.popen("ls -l").read()
方法討論:
問題解決了,那么os.system 和 subprocess哪個解決方法更好呢?這里做簡單討論,雖然os.system 和 subprocess 都能完成外部命令功能,但是subprocess比system更加靈活(subprocess 我們可以得到 stdout,stderr 以及更好的錯誤處理等等)。并且官方文檔也是更建議subprocess模塊。
總覺:
1、os.system("some_command with args"):將命令和參數傳給系統shell,這個方法可以一次執行多條命令,并且可以建立管道重定向。
os.system("some_command < input_file | another_command > output_file ")
盡管這種方式很簡便,但是你不得不手工處理一些特殊字符例如空格等。
2、stream = os.popen("some_command with args"):實現功能和os.system是一樣的,但是os.popen會返回一個類文件對象,讓你看到命令的執行結果。
stream = os.popen("ls -l")
stream.read()
3、subprocess 的 Popen 類,建議盡量使用它來替代os.popen,但是使用的時參數會相對復雜
print(subprocess.Popen("echo Hello Worldd", shell=True, stdout=subprocess.PIPE).stdout.read())
而不建議使用
print(os.popen("echo Hello World")).read()
4、subprocess 模塊中 call 函數,功能和Popen類相似,并且使用相同的參數,但是它僅僅在命令執行完畢后,返回一個代碼
return_code = subprocess.call("echo Hello World", shell=True)
0 # 執行成功
5、如果使用時Python3.5及以上版本,可以使用subprocess.run函數,它跟上面介紹的函數基本一樣,但是更加靈活,會在命令執行結束后返回一個CompletedProcess對象。
return_code = subprocess.run("echo Hello World", shell=True)
print return_code
>>> CompletedProcess(args='echo Hello World', return_code=0)
6、雖然os模塊包括fork/exec/spawn等函數,但是并不建議直接使用它們,使用不當會導致意外的結果。
因此如果有需要執行的外部命令的需要,建議使用 subprocess,而非os模塊。
最后,特別要注意如果你要執行的命令是以字符串的形式作為參數,那么必須小心謹慎,否則會造成嚴重的后果!
例如:
print(subprocess.Popen("echo %s" % user_input, stdout=PIPE).stdout.read())
看到這段代碼能想到什么可怕的事情嗎?如果有人給 user_input 傳遞的是“my mama didnt love me && rm -rf /”,是不是頭皮發麻!所以謹慎再謹慎!盡量不做交互是輸入,而是在程序中將要執行的命令,寫‘死’在字符串中,作為常量傳遞。
總結
以上是生活随笔為你收集整理的python echo命令_如何用Python调用外部命令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mfc打开一个.txt文件并进行处理_文
- 下一篇: mysql 存储引擎版本_mysql不