【发布时间】:2015-07-23 14:07:58
【问题描述】:
我有一个与几年前问过的一个几乎相同的问题:Python subprocess with two inputs 收到了一个答案但没有实施。我希望这篇转发可以帮助我和其他人澄清问题。
如上所述,我想使用 subprocess 来包装一个命令行工具,该工具需要多个输入。特别是,我想避免将输入文件写入磁盘,而是宁愿使用例如命名管道,正如上面提到的。那应该是“学习如何”,因为我承认我以前从未尝试过使用命名管道。我将进一步说明,我目前拥有的输入是两个 pandas 数据帧,我想取回一个作为输出。
通用命令行实现:
/usr/local/bin/my_command inputfileA.csv inputfileB.csv -o outputfile
可以预见的是,我当前的实现不起作用。我不知道数据帧是如何/何时通过命名管道发送到命令进程的,我将不胜感激!
import os
import StringIO
import subprocess
import pandas as pd
dfA = pd.DataFrame([[1,2,3],[3,4,5]], columns=["A","B","C"])
dfB = pd.DataFrame([[5,6,7],[6,7,8]], columns=["A","B","C"])
# make two FIFOs to host the dataframes
fnA = 'inputA'; os.mkfifo(fnA); ffA = open(fnA,"w")
fnB = 'inputB'; os.mkfifo(fnB); ffB = open(fnB,"w")
# don't know if I need to make two subprocesses to pipe inputs
ppA = subprocess.Popen("echo",
stdin =subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
ppB = subprocess.Popen("echo",
stdin = suprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
ppA.communicate(input = dfA.to_csv(header=False,index=False,sep="\t"))
ppB.communicate(input = dfB.to_csv(header=False,index=False,sep="\t"))
pope = subprocess.Popen(["/usr/local/bin/my_command",
fnA,fnB,"stdout"],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
(out,err) = pope.communicate()
try:
out = pd.read_csv(StringIO.StringIO(out), header=None,sep="\t")
except ValueError: # fail
out = ""
print("\n###command failed###\n")
os.unlink(fnA); os.remove(fnA)
os.unlink(fnB); os.remove(fnB)
【问题讨论】:
标签: python pandas subprocess