python将输出写入不同的fifo管道文件?

python将输出写入不同的fifo管道文件?,python,mysql,pipe,fifo,Python,Mysql,Pipe,Fifo,我试图将一个非常大的文本文件分成两部分,并将这两部分转储到两个不同的mysql表中。我在python中这样做,逐行检查文本,并通过分类代码对每行进行分类 现在,在我划分文本之后,我如何将它们分成两个独立的fifo文件,以便将这些fifo传输到mysql客户端工具 我想您要做的是调用MYSQL命令 LOAD DATA INFILE 没有实际创建内嵌。您可以尝试使用mysqlimport命令行客户机,如果它愿意接受管道,可以执行以下操作: python categorize.py --code x

我试图将一个非常大的文本文件分成两部分,并将这两部分转储到两个不同的mysql表中。我在python中这样做,逐行检查文本,并通过分类代码对每行进行分类


现在,在我划分文本之后,我如何将它们分成两个独立的fifo文件,以便将这些fifo传输到mysql客户端工具

我想您要做的是调用MYSQL命令

LOAD DATA INFILE
没有实际创建内嵌。您可以尝试使用
mysqlimport
命令行客户机,如果它愿意接受管道,可以执行以下操作:

python categorize.py --code x big_text_file.txt | mysqlimport db_name /dev/stdin

您的Python脚本通过命令行上的代码输入分割文本文件,并将结果作为字符串输出,然后通过管道传输到mysqlimport。

我想您是在为来自同一Python脚本的两个单独的、显然同时进行的MySQL导入创建管道

虽然通过shell重定向实现这一点并非不可能,但这将是一件痛苦的事情。Python脚本必须以某种方式将其管道的文件描述符传递给shell,以便shell脚本可以将这些文件描述符重定向到MySQL命令

一个更简单的解决方案是使用Python和模块来实现

我不知道您希望用于批量加载的工具和语法;你告诉我们的只是你想给它一个“烟斗”。因此,我将假设它是hbristow的回答中提到的
mysqlimport
命令,并且它通过通常的Unix约定将stdin作为文件名
-
处理;因为这只是为了演示实际有趣的部分,所以不管怎么说,这并不重要

因此:

我们已经创建了两个独立的子进程,每个子进程都有自己独立的
stdin
管道,我们可以像写入任何其他文件一样写入它们

如果
mysqlimport
工具希望您在实际等待输入文件退出之前关闭输入文件的/EOF,则可能需要
import1.stdin.close()
import2.stdin.close()


如果您使用的是Python 2.4-2.7,那么应该安装并使用backport。如果由于某种原因不能这样做(或者如果您使用的是Python 3.0-3.1,并且由于某种原因不能升级),那么您不能在此处使用
with
语句;相反,您需要显式地
关闭管道并
等待流程。

什么是管道文件?为什么不直接通过python访问mysql?插入每一行都太慢了,通过管道我可以使用mysql“加载数据”,这比“插入”快得多。你能再次解释一下你说的“管道文件”是什么意思吗?对不起,我的意思是使用fifo。我正在使用一个名为pt fifo split的percona工具,它可以读取fifo文件。但他显然想创建两个单独的管道,而不仅仅是一个,所以这不起作用。这很好,至少它向我展示了分离的过程,那么,sql函数的作用是什么呢?这个函数返回什么?@suanmeigo:它做你想做的任何事情。假设您正在尝试为每一行输入数据生成一行数据或一条语句作为输出,以传递给MySQL批量加载程序。该函数用于放置生成该输出的代码,并将其作为字符串(包括尾随换行符)返回。
from subprocess import Popen, stdin

args = ['mysqlimport', my_db_name, '-']
with Popen(args, stdin=PIPE) as import1, Popen(args, stdin=PIPE) as import2:
    with open('giantfile.txt') as f:
        for line in f:
            data = parse(line)
            if belongs_in_import2(data):
                import2.stdin.write(make_sql(data))
            else:
                import1.stdin.write(make_sql(data))