python中的bash命令

时间:2013-02-28 13:05:15

标签: python bash

我正在寻找在python中使用bash命令的最佳方法。有什么方法?我知道os.system和subprocess.Popen。

我试过这些:

bootfile = os.system("ls -l /jffs2/a.bin | cut -d '/' -f 4")
print bootfile

这会按预期返回a.bin,但之后也会返回0,因此打印:

a.bin
0

现在将bootfile设置为0.下次我打印bootfile时它只显示为0.我猜这是退出值,如何阻止此值干扰?

我也尝试过:

bootfile = subprocess.Popen("ls -l /jffs2/a.bin | cut -d '/' -f 4")
print bootfile

但似乎打破了剧本,因为我根本没有得到任何回报,我做到了吗?

还有哪些更好,为什么?还有其他方式,首选方式是什么?

3 个答案:

答案 0 :(得分:3)

使用os.readlink(由@kojiro提出)和os.path.basename仅获取名称文件:

os.path.basename(os.readlink('/jffs2/a.bin'))

答案 1 :(得分:2)

kojiro关于os.readlink的评论可能就是你想要的。 我正在解释你想要实施的内容。

os.system会返回命令运行的退出状态。

subprocess.Popen将创建一个管道,以便您可以捕获命令运行的输出 下面的行将捕获命令运行的输出:

bootfile = subprocess.Popen(["bash","-c","ls -l /jffs2/a.bin | cut -d '/' -f 4"], stdout=subprocess.PIPE).communicate()[0]

http://docs.python.org/library/subprocess.html

的更多详情

答案 2 :(得分:1)

正如@kojiro所说,正确答案是:

os.readlink('/jffs2/a.bin')

但如果你真的想以复杂的方式做到这一点,那么在Python 2.7中:

cmd = "ls -l /jffs2/a.bin | cut -d '/' -f 4"
bootfile = subprocess.check_output(cmd, shell=True)

或者在古老的蟒蛇身上:

cmd = "ls -l /jffs2/a.bin | cut -d '/' -f 4"
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
bootfile = p.communicate()[0]
if p.returncode != 0:
    raise Exception('It failed')