使用Python列表作为Linux命令的标准输入输入
我正在使用Python脚本将数据加载到一个数据库的批量加载器中。
这个加载器的输入是标准输入(stdin)。我一直没能找到正确的语法来调用基于Unix的批量加载器,并将一个Python列表的内容传递给它。
我在研究Popen和PIPE这两个东西,但它们的表现和我预期的不太一样。
这个Python列表里包含了要批量加载的数据库记录。在Linux中,它的样子大概是这样的:
echo "this is the string being written to the DB" | sql -c "COPY table FROM stdin"
那么,正确的方法是什么呢?如何用一个Python列表替换掉echo语句,以便和这个命令一起使用呢?
我没有这个过程的示例代码,因为我一直在尝试Popen和PIPE的一些简单语法,但没有得到想要的结果。
任何帮助都会非常感激。
谢谢
1 个回答
5
如果你的数据比较短且简单,你可以提前把整个列表格式化好,然后用一个简单的方法通过子进程来处理,就像这样:
import subprocess
data = ["list", "of", "stuff"]
proc = subprocess.Popen(["sql", "-c", "COPY table FROM stdin"], stdin=subprocess.PIPE)
proc.communicate("\n".join(data))
但是如果数据太大,没法像这样提前格式化,那么你可以尝试直接使用标准输入管道。不过要注意,使用子进程模块时,如果你还需要从标准输出或标准错误中读取数据,可能会遇到一些问题。
for line in data:
print >>proc.stdin, line