Я думаю, что вы хотите создать трубы для двух отдельных и, по-видимому, одновременного импорта MySQL из одного и того же сценария Python?
Хотя это не невозможно, чтобы сделать это через перенаправление оболочки, это будет болезненно. Ваш скрипт Python должен каким-то образом передать файловые дескрипторы своих труб в оболочку, поэтому ваш сценарий оболочки может перенаправить эти файловые дескрипторы в команды MySQL.
Гораздо проще решить это на Python с помощью модуля subprocess
.
Я не знаю инструмент и синтаксис, которые вы надеетесь использовать для выполнения массовой загрузки; все, что вы нам сказали, это то, что вы хотите дать ему «трубу». Итак, я просто предполагаю, что это команда mysqlimport
, упомянутая в ответе hbristow, и что она обрабатывает stdin через обычное соглашение 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
трубы, и мы можем записать их так же, как мы можем, чтобы любые другие файлы.
Вам может понадобиться import1.stdin.close()
и import2.stdin.close()
если инструмент mysqlimport
ожидает от вас, чтобы закрыть/EOF файл ввода, прежде чем на самом деле ждет от него, чтобы выйти.
Если вы используете Python 2.4-2.7, вы должны установить и использовать задний порт subprocess32
. Если вы не можете сделать это по какой-либо причине (или если вы используете Python 3.0-3.1 и не можете обновить по какой-либо причине), здесь вы не можете использовать оператор with
; вместо этого вам нужно явно указатьна трубы и wait
процессы.
Что такое файл трубы? Почему бы просто не получить доступ к mysql через python? – msvalkon
, который будет слишком медленным, чтобы вставлять каждую строку, через конвейер я могу использовать mysql 'load data', который очень быстрый, чем 'insert' – Suanmeiguo
Можете ли вы еще раз объяснить, что вы имеете в виду, когда говорите «файл трубы»? – Bach