【问题标题】:Using ls in Python subprocess.Popen function在 Python subprocess.Popen 函数中使用 ls
【发布时间】:2013-04-12 06:58:13
【问题描述】:
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

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

【问题讨论】:

标签: python subprocess ls


【解决方案1】:

您收到错误是因为 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

【讨论】:

    【解决方案2】:

    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!)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-06
      • 2014-01-15
      • 2011-07-07
      • 1970-01-01
      相关资源
      最近更新 更多