4

我正在寻找在 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

但它似乎破坏了脚本,因为我什么也没得到,我做对了吗?

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

4

3 回答 3

3

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

os.path.basename(os.readlink('/jffs2/a.bin'))
于 2013-02-28T14:16:28.507 回答
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

于 2013-02-28T13:25:14.083 回答
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)

或者在较旧的 Python 上:

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')
于 2013-03-01T11:11:37.153 回答