os.system()和os.popen()
1.python调用Shell脚本,有两种方法:os.system()和os.popen(),
前者返回值是脚本的退出状态码,后者的返回值是脚本执行过程中的输出内容。
>>>help(os.system)
Help on built-in function system in module posix:
system(...)
system(command) -> exit_status
Execute the command (a string) in a subshell.
>>> help(os.popen)
Help on built-in function popen in module posix:
popen(...)
popen(command [, mode='r' [, bufsize]]) -> pipe
Open a pipe to/from a command returning a file object.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 假定有一个shell脚本test.sh:
song@ubuntu:~$ vi test.sh
song@ubuntu:~$ more test.sh
#!/bin/bash
echo 'hello python!'
echo 'hello world!'
exit 1
song@ubuntu:~$
- 1
- 2
- 3
- 4
- 5
- 6
- 7
2.1 os.system(command)
:该方法在调用完shell脚本后,返回一个16位的二进制数,
低位为杀死所调用脚本的信号号码,高位为脚本的退出状态码,
即脚本中exit 1
的代码执行后,os.system
函数返回值的高位数则是1,如果低位数是0的情况下,
则函数的返回值是0x0100
,换算为十进制得到256。
要获得os.system
的正确返回值,可以使用位移运算(将返回值右移8位)还原返回值:
>>> import os
>>> os.system("./test.sh")
hello python!
hello world!
256
>>> n=os.system("./test.sh")
hello python!
hello world!
>>> n
256
>>> n>>8
1
>>>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
2.2 os.popen(command)
:这种调用方式是通过管道的方式来实现,函数返回一个file对象,
里面的内容是脚本输出的内容(可简单理解为echo
输出的内容),使用os.popen
调用test.sh的情况:
>> import os
>>> os.popen("./test.sh")
<open file './test.sh', mode 'r' at 0x7f6cbbbee4b0>
>>> f=os.popen("./test.sh")
>>> f
<open file './test.sh', mode 'r' at 0x7f6cbbbee540>
>>> f.readlines()
['hello python!\n', 'hello world!\n']
>>>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
3》像调用”ls”这样的shell命令,应该使用popen的方法来获得内容,对比如下:
>>> import os
>>> os.system("ls") #直接看到运行结果
Desktop Downloads Music Public Templates Videos
Documents examples.desktop Pictures systemExit.py test.sh
0 #返回值为0,表示命令执行成功
>>> n=os.system('ls')
Desktop Downloads Music Public Templates Videos
Documents examples.desktop Pictures systemExit.py test.sh
>>> n
0
>>> n>>8 #将返回值右移8位,得到正确的返回值
0
>>> f=os.popen('ls') #返回一个file对象,可以对这个文件对象进行相关的操作
>>> f
<open file 'ls', mode 'r' at 0x7f5303d124b0>
>>> f.readlines()
['Desktop\n', 'Documents\n', 'Downloads\n', 'examples.desktop\n', 'Music\n', 'Pictures\n', 'Public\n', 'systemExit.py\n', 'Templates\n', 'test.sh\n', 'Videos\n']
>>>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
总结:os.popen()可以实现一个“管道”,从这个命令获取的值可以继续被使用。因为它返回一个文件对象,可以对这个文件对象进行相关的操作。
但是如果要直接看到运行结果的话,那就应该使用os.system,用了以后,立竿见影!