python版本是2.7.12
一、簡單的獲取linux命令的執行結果,比如:獲取一個PID的進程樹結構,linux命令是pstree -p pid,在python中有一個模塊可以方便的獲取。至於有時候獲取的結果是亂碼的情況,請參考之前的隨筆:ubuntu常用的一些命令
命令是 commands.
getoutput
(cmd),
cmd = "pstree -p %s"%pid result = commands.getoutput(cmd)
二、開啟一個新的進程來執行腳本文件,就需要使用python中另一個模塊了,subprocess,官網地址
接下來進行簡單的函數說明
1 subprocess.
call
(args, *, stdin=None, stdout=None, stderr=None, shell=False)調用進程會等待子進程執行args結束,然后將returncode返回。
2 subprocess.
check_output
(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False) 調用進程會等待子進程執行args結束,然后將他的輸出以byte string形式返回。注意:如果return code是非零值,將產生一個CalledProcessError異常,
如果想以子進程的形式調用命令,則需要使用Popen類。
subprocess.
Popen
(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False,shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)
默認情況下,他會開一個子進程,並且是非阻塞。args可以是參數列表[]或者是一個字符串""。shell參數表示是否打開shell執行程序,如果shell參數是True,官方推薦args寫成字符串形式。
舉個簡單例子:
p1=subprocess.Popen("ls",shell=True)
>>> p=subprocess.Popen("ls")
>>> myfile.txt
test.py文件
import time def fun1(): for i in range(1000): time.sleep(1) if __name__ == "__main__": fun1()
>>> import subprocess
>>> p2=subprocess.Popen("python test.py",shell=True)
查看進程情況
>>>ps -ef|grep test.py
penchenz 28020 28015 0 15:24 pts/4 00:00:00 python test.py
penchenz 28082 28043 0 15:24 pts/12 00:00:00 grep test.py
執行結果
>>>top -p 28020
top - 15:25:01 up 23 days, 17:49, 20 users, load average: 0.10, 0.09, 0.06 Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie Cpu(s): 1.2%us, 0.6%sy, 0.0%ni, 98.2%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 32883356k total, 32028992k used, 854364k free, 940836k buffers Swap: 16515068k total, 214156k used, 16300912k free, 10079088k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 28020 penchenz 20 0 113m 4488 1836 S 0.0 0.0 0:00.05 python
其他更詳細的用法請參考subprocess官網地址