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
为什么第一个代码失败了?我错过了什么?
答案 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!)