Python,subprocess模塊(補充)


1.subprocess模塊,前戲
res = os.system('dir') 打印到屏幕,res為0或非0
os.popen('dir') 返回一個內存對象,相當於文件流
a = os.popen('dir').read() a中就存的是執行結果輸出了

Python2.7 commands模塊 commands.getstatusoutput('dir')返回元祖,第一個元素為狀態0為成功,第二個為結果
windows上不好用,只是Linux好用




subprocess模塊,替換os.system等

subprocess.run(['df','-h']) 當參數傳,Python解析,如果有管道符就不行了
subprocess.run('df -h | grep sda1', shell=True) shell=True是指不需要Python解析,直接把字符串給shell
Python3.5才出現subprocess.run
終端輸入的命令分為兩種:
輸入即可得到輸出,如:ifconfig
輸入進行某環境,依賴再輸入,如:Python

常用subprocess

沒有管道
retcode = subprocess.call(['ls','-l']) 成功返回0,不成功返回非0
subprocess.check_call(['ls','-l']) 執行成功返回0,執行錯誤拋異常
subprocess.getoutput('ls /bin/ls')接收字符串格式命令,只返回結果
res = subprocess.check_output(['ls','-l'])執行成功返回執行結果,不成功出錯
subprocess.getstatsoutput('ls /bin/ls') 返回元祖(1,'/bin/ls'),第一個狀態,第二個結果

上面的方法,底層都是封裝subprocess.popen
例子
res = subprocess.popen('ifconfig | grep 192',shell=True)
res
<subprocess.popen object at ox7f2131a>
res.stdout.read()讀不出來
要讀出來要先輸出到標准輸出里,先存到管道PIPE 再給stdout python和shell是兩個進程不能獨立通信,必須通過操作系統提供的管道
用管道可以把結果存到stdin stdout stderr
subprocess.popen('ifconfig | grep 192',shell=True,stdout=subprocess.PIPE)
res.stdout.read()就可以讀出來了
subprocess.popen('ifconfig | gr1111ep 192',shell=True,stdout=subprocess.PIPE)
出錯會直接打印錯誤。想不打印錯誤可以stderr保存stderr=subprocess.PIPE


poll() check if child process has terminated. returns returncode
---------
res=subprocess.popen("sleep 10;echo 'hello'", shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
執行的時候沒反應,不知道是卡主了還是執行完了
每次調subprocess執行Linux命令,都相當於啟動了一個新的shell,啟動新的進程,執行一次命令等結果
如果該命令要花半小時,不知道是卡主了還是執行完了,可以res.poll()返回none表示還沒有執行完,返回0表示執行完了
res.wait()等待結束然后返回0
----------
terminate()殺掉該進程,res.terminate()
wait() wait for child process to terminate. returns returncode attribute
communicate()等待任務結束 沒什么用,用Python當參數,輸Python進入環境
stdin 標准輸入
stdout 標准輸出
stderr 標准錯誤
pid the process ID of the child process


-----可用參數
args: shell命令,可以是字符串或者序列類型
bufsize:指定緩沖,0無緩沖,1 行緩沖,其他 緩沖區大小 負值 系統緩沖
stdin,stdout,stderr:標准輸入,輸出,錯誤句柄
preexec_fn:只在Unix平台下有效,用於指定一個可執行對象,它將在子進程運行之前被調用
close_sfs:在Windows平台下,如果close_sfs被設置為True,則新創建的子進程將不會繼承父進程的輸入、輸出、錯誤管道
所以不能將close_fds設置為True同時重定向子進程的標准輸入、輸出與錯誤

shell:同上
cod:用於設置子進程的當前目錄
env:用於指定子進程的環境變量。如果env=None,子進程的環境變量將從父進程中繼承
universal_newlines:不同系統的換行符不同,True->同意使用\n
startupinfo與createionflags只在Windows下有效
將被傳遞給底層的createprocess()函數,用於設置子進程的一些屬性,
如:主窗口的外觀,進程的優先級等


subprocess實現sudo自動輸入密碼
例如Python里面執行sudo apt-get install vim (Linux里面要輸入密碼)
linux中應該echo '123' | sudo -S iptables -L
python直接 subprocess.popen("echo '123' | sudo -S iptables -L",shell=True)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM