在Python subprocess.Popen函数中使用ls

时间:2013-04-12 06:58:14

标签: python subprocess ls

proc = subprocess.Popen(['ls', '-v', self.localDbPath+'labris.urls.*'], stdout=subprocess.PIPE)
while True:
    line = proc.stdout.readline()
    if line != '':
        print line
    else:
        break

使用上面的代码时,我收到错误提示:

ls: /var/lib/labrisDB/labris.urls.*: No such file or directory

但是当我从shell中得到同样的东西时,我没有错误:

ls -v /var/lib/labrisDB/labris.urls.*

此外,这也不会产生任何错误:

proc = subprocess.Popen(['ls', '-v', self.localDbPath], stdout=subprocess.PIPE)
while True:
    line = proc.stdout.readline()
    if line != '':
        print line
    else:
        break

为什么第一个代码失败了?我错过了什么?

2 个答案:

答案 0 :(得分:5)

您收到错误,因为python subprocess 无法像 bash 那样扩展*。

更改您的代码:

from glob import glob
proc = subprocess.Popen(['ls', '-v'] + glob(self.localDbPath+'labris.urls.*'), stdout=subprocess.PIPE)

以下是有关python和解决方案中的glob扩展的更多信息:Shell expansion in Python subprocess

答案 1 :(得分:1)

Globbing由shell完成。因此,当您在终端中运行ls *时,您的shell实际上正在调用ls file1 file2 file3 ...

如果你想做类似的事情,你应该看看glob模块,或者只是通过shell运行你的命令:

proc = subprocess.Popen('ls -v ' + self.localDbPath + 'labris.urls.*',
                        shell=True,
                        stdout=subprocess.PIPE)

(如果您选择后者,请务必阅读security warnings!)