1. os.system
In [32]: run = os.system("date") Thu Jan 28 09:41:25 CST 2016 In [33]: run Out[33]: 0
只能得到返回值,无法得到输出。
2. os.popen
In [35]: run = os.popen("date") In [36]: run.read Out[36]: <function read> In [37]: run.read() Out[37]: 'Thu Jan 28 09:43:14 CST 2016 '
只能得到输出,无法得到返回值。
3. commands模块
In [39]: run = commands.getstatusoutput("date") In [40]: run Out[40]: (0, 'Thu Jan 28 09:44:44 CST 2016')
返回一个数组。
4. subprocess模块
4.1 call
In [42]: run = subprocess.call(["uname","-a"], shell=True) Linux In [43]: run Out[43]: 0
直接输出结果,将返回值赋值给变量,类似os.system
4.2 Popen
In [44]: run = subprocess.Popen("uname -a", shell=True,stdout=subprocess.PIPE) In [48]: run.stdout.read() Out[48]: 'Linux test-sun207 3.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36:42 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux ' In [49]: run.wait() Out[49]: 0
注意: 当执行命令的参数或者返回中包含了中文文字,那么建议使用subprocess,如果使用os.popen则会出现错误。
5. sh模块
安装:pip install sh
In [62]: from sh import ifconfig In [63]: run = sh.ifconfig In [64]: run Out[64]: <Command '/usr/sbin/ifconfig'> In [65]: run() Out[65]: ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.1.207 netmask 255.255.255.0 broadcast 192.168.1.255 inet6 fe80::20c:29ff:fe71:888 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:71:08:88 txqueuelen 1000 (Ethernet) RX packets 95617464 bytes 8518940518 (7.9 GiB) RX errors 0 dropped 7078520 overruns 0 frame 0 TX packets 1175268 bytes 172715015 (164.7 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 0 (Local Loopback) RX packets 191 bytes 58512 (57.1 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 191 bytes 58512 (57.1 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 In [67]: run.bake() Out[67]: <Command '/usr/sbin/ifconfig'> In [68]: run('lo') Out[68]: lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 0 (Local Loopback) RX packets 191 bytes 58512 (57.1 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 191 bytes 58512 (57.1 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
执行脚本:
import sh run = sh.Command("/home/amoffat/run.sh") # Absolute path run()
多个参数:
from sh import tar tar("cvf", "/tmp/test.tar", "/my/home/directory")
关键字参数:
# resolves to "curl http://duckduckgo.com/ -o page.html --silent" curl("http://duckduckgo.com/", o="page.html", silent=True) # or if you prefer not to use keyword arguments, this does the same thing: curl("http://duckduckgo.com/", "-o", "page.html", "--silent") # resolves to "adduser amoffat --system --shell=/bin/bash --no-create-home" adduser("amoffat", system=True, shell="/bin/bash", no_create_home=True) # or adduser("amoffat", "--system", "--shell", "/bin/bash", "--no-create-home")
返回值:
output = ls("/") print(output.exit_code) # should be 0
#捕获异常: try: print(ls("/some/non-existant/folder")) except ErrorReturnCode_2: print("folder doesn't exist!") create_the_folder() except ErrorReturnCode: print("unknown error") exit(1)
###:
In [92]: sh.ls(sh.glob('*.txt')) Out[92]: requirements.txt
tail:
In [93]: for line in sh.tail("-f", "requirements.txt", _iter=True): ....: print line #实现其他更好玩的功能 ....: requests==2.9.0 six==1.10.0 slip==0.4.0
#callback实现: def process_output(line): print(line) p = tail("-f", "/var/log/some_log_file.log", _out=process_output) p.wait()