【问题标题】:Piping data from python to an external command将数据从 python 管道传输到外部命令
【发布时间】:2012-08-03 12:35:16
【问题描述】:

我已经阅读了关于 subprocess.Popen 的所有内容,但我认为我遗漏了一些东西。

我需要能够执行一个 unix 程序,该程序从 python 脚本中创建的列表中读取数据流,并将该程序的结果写入文件。在 bash 提示符下,我一直这样做没有问题,但现在我试图从一个 python 脚本中执行此操作,该脚本在进入这个阶段之前预处理了一些二进制文件和大量数据。

让我们看一个不包括所有预处理的简单示例:

import sys
from pylab import *
from subprocess import *
from shlex import split

# some arbitrary x,y points
points = [(11,31),(13,33),(15,37),(16,35),(17,38),(18,39.55)]

commandline = 'my_unix_prog option1 option2 .... > outfile'
command = split(commandline)

process = Popen(command, stdin=PIPE, stdout=PIPE, stderr=PIPE)
print process.communicate(str(points))

这在 bash 中的执行方式是:

echo "11 31
      13 33
      15 37
      16 35
      17 38
      18 39.55" | my_unix_prog option1 option2 .... > outfile

将数据输入 unix prog 的方式也很重要,我应该格式化为 2 列,用空格分隔。

感谢任何帮助...

【问题讨论】:

  • command 中,您将输出重定向到outfile,但随后您尝试使用communicate 将其读入您的程序。您希望输出到哪里?
  • 使用 '>' 不是将输出重定向到文件的方法,请参阅此答案:stackoverflow.com/questions/8902206/…

标签: python subprocess external-process piping


【解决方案1】:

解决了!

Dharaxhainingx 的帮助下,我能够解决这个问题:

import sys
from pylab import *
from subprocess import *
from shlex import split

# some arbitrary x,y points
points = [(11,31),(13,33),(15,37),(16,35),(17,38),(18,39.55)]

commandline = 'my_unix_prog option1 option2 ....'
command = split(commandline)

process = Popen(command, stdin=PIPE, stdout=open('outfile', 'w'), stderr=PIPE)
for p in points:
    process.stdin.write(str(p[0]) + ' ' + str(p[1]) + '\n')

print process.communicate()

这很好用,谢谢。

【讨论】:

  • 我还建议您在调用 Popen 之外创建文件对象,以便稍后在您和您的子进程完成时调用.close()
【解决方案2】:

您需要格式化输入以正确通信。

str 将在您打印您不想要的元组列表时保留特殊字符。

>>> print str([(1,2), (3,4)]) 
[(1,2), (3,4)]

试试这个:

print process.communicate("\n".join(["%s %s"%(x[0], x[1]) for x in points])

【讨论】:

    【解决方案3】:

    怎么样

    for p in points:
        process.stdin.write(str(p[0]) + ' ' + str(p[1]) + '\n')
    
    print process.communicate()
    

    【讨论】:

    • 是的,你是对的(你们俩),但我认为我的问题在此之前就开始了:我使用了 '>' 重定向,但这是 shell 重定向并且无效。
    • @Shahar 你可以在你的 Popen 构造函数中使用shell=True 参数来允许shell重定向,但是communicate 不会为标准输出返回任何东西。另一种选择是打开文件f=open('outfile', 'w'),然后使用stdout=f 而不是PIPE。我不确定现在是什么问题
    猜你喜欢
    • 2013-10-13
    • 2011-12-13
    • 1970-01-01
    • 2018-08-18
    • 2020-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多