использование списка Python в качестве входных данных для команды Linux, которая использует стандартный ввод в качестве ввода - PullRequest
3 голосов
/ 11 октября 2011

Я использую скрипты Python для загрузки данных в массовый загрузчик базы данных.

Вход в загрузчик - стандартный ввод.Мне не удалось получить правильный синтаксис для вызова массового загрузчика на основе Unix, передавая содержимое списка Python для загрузки.

Я читал о Popen и PIPE, но они не вели себя так, как я ожидаю.

Список python содержит записи базы данных для массовой загрузки.В Linux это будет выглядеть примерно так:

echo "this is the string being written to the DB" | sql -c "COPY table FROM stdin"

Как правильно заменить оператор echo списком python для использования с этой командой?

У меня нет примеракод для этого процесса, так как я экспериментировал с функциями Popen и PIPE с очень простым синтаксисом и не получил желаемого результата.

Любая помощь будет очень цениться.

Спасибо

1 Ответ

4 голосов
/ 11 октября 2011

Если ваши данные короткие и простые, вы можете предварительно отформатировать весь список и сделать это просто с подпроцессом, подобным этому:

import subprocess
data = ["list", "of", "stuff"]
proc = subprocess.Popen(["sql", "-c", "COPY table FROM stdin"], stdin=subprocess.PIPE)
proc.communicate("\n".join(data))

Если данные слишком велики для такого предварительного форматирования, вы можете попытаться использовать канал stdin напрямую, хотя модуль подпроцесса не работает при использовании каналов, если вам нужно читать также из stdout / stderr.

for line in data:
    print >>proc.stdin, line
...