在Python subprocess.Popen函数中使用ls

Alp*_*gay 2 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
Run Code Online (Sandbox Code Playgroud)

使用上面的代码时,我得到错误说:

ls: /var/lib/labrisDB/labris.urls.*: No such file or directory
Run Code Online (Sandbox Code Playgroud)

但是,当我从shell中获取相同内容时,我没有错误:

ls -v /var/lib/labrisDB/labris.urls.*
Run Code Online (Sandbox Code Playgroud)

这也不会给出任何错误:

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

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

小智 5

你得到错误,因为python 子进程无法像bash一样扩展*.

像这样更改你的代码:

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

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