2
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

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

4

2 回答 2

5

您会收到错误,因为 python子进程无法像bash一样扩展 * 。

像这样更改您的代码:

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

以下是有关 python 中的 glob 扩展和解决方案的更多信息:Python 子进程中的 Shell 扩展

于 2013-04-12T07:02:47.127 回答
1

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

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

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

(如果您选择后者,请务必阅读安全警告!)

于 2013-04-12T07:02:13.397 回答