我认为您希望从同一个 Python 脚本为两个独立且显然是同时的 MySQL 导入创建管道?
虽然不可能通过 shell 重定向来做到这一点,但它会很痛苦。您的 Python 脚本必须以某种方式将其管道的文件描述符传递给 shell,因此您的 shell 脚本可以将这些文件描述符重定向到 MySQL 命令。
一个更简单的解决方案是在 Python 中使用 subprocess 模块。
我不知道您希望用于批量加载的工具和语法;你告诉我们的只是你想给它一个“管道”。因此,我将假设它是 hbristow 的答案中提到的 mysqlimport 命令,并且它通过通常的 Unix 约定处理标准输入,将其提供为 - 作为文件名;因为这只是为了展示真正有趣的部分,所以无论如何都不是很重要。
所以:
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))
我们创建了两个独立的子进程,每个子进程都有自己独立的stdin 管道,我们可以像写入任何其他文件一样向它们写入数据。
如果mysqlimport 工具希望您在实际等待输入文件退出之前关闭/EOF,您可能需要import1.stdin.close() 和import2.stdin.close()。
如果您使用的是 Python 2.4-2.7,则应安装并使用 subprocess32 反向端口。如果由于某种原因不能这样做(或者如果您使用 Python 3.0-3.1 并且由于某种原因无法升级),则不能在此处使用 with 语句;相反,您需要显式地 close 管道和 wait 进程。