python os.system和os.popen

本文详细介绍了在Python中如何使用os.system()和os.popen()两种方法调用Shell脚本,解释了它们的返回值及应用场景。通过实例演示了如何获取脚本的输出内容和正确解读os.system()的返回值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

推荐一个大神的人工智能教程!http://blog.youkuaiyun.com/jiangjunshow

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.


2》假定有一个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:~$ 

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

>>> 

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’]

>>> 

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’]

>>> 

总结:os.popen()可以实现一个“管道”,从这个命令获取的值可以继续被使用。因为它返回一个文件对象,可以对这个文件对象进行相关的操作。

但是如果要直接看到运行结果的话,那就应该使用os.system,用了以后,立竿见影!


 

 



推荐一个大神的人工智能教程!http://blog.youkuaiyun.com/jiangjunshow

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值