Принуждение сценария Python взять вход от STDIN

Скрипт Python, который я должен запустить, берет вход только из файла, переданного как параметр командной строки, как так:

$ markdown.py input_file

Там какой-либо путь состоит в том, чтобы заставить это принимать вход от STDIN вместо этого? Я хочу смочь сделать это через Bash, значительно не изменяя сценарий Python:

$ echo "Some text here" | markdown.py

Если бы я должен изменить сценарий Python, как я пошел бы об этом?

(РЕДАКТИРОВАНИЕ: Вот сценарий, который анализирует параметры командной строки.)

7
задан Karthik 21 July 2010 в 01:23
поделиться

5 ответов

Я не уверен, насколько он портативен, но в системах Unix-y вы можете назвать / dev / stdin в качестве своего файла:

$ echo -n hi there | wc /dev/stdin
       0       2       8 /dev/stdin
11
ответ дан 6 December 2019 в 14:00
поделиться

Я предполагаю, исходя из деталей вашего вопроса, который вы задаете о Python-Markdown, поэтому я отследил для вас соответствующую строку в исходном коде: сделать это так, как Даниэль, в строке 443 из markdown / __ init __. py , вам нужно заменить

input_file = codecs.open(input, mode="r", encoding=encoding)

на

input_file = codecs.EncodedFile(sys.stdin, encoding)

. Хотя тогда вы не сможете впоследствии обрабатывать файлы, поэтому для более полезного взлома вы можете добавить условный :

if input:
    input_file = codecs.open(input, mode="r", encoding=encoding)
else:
    input_file = codecs.EncodedFile(sys.stdin, encoding)

, а затем вам придется настроить markdown / commandline.py , чтобы не выходить, если ему не указано имя файла: измените строки 72-73

parser.print_help()
return None, None

на

input_file = None

. , это не так-то просто. Здесь я собирался предложить использовать специальный файл, как это сделал Марк Рушаков, если бы он меня не опередил; -)

0
ответ дан 6 December 2019 в 14:00
поделиться

Убедитесь, что это находится в верхней части файла:

import sys

Затем найдите что-то вроде этого:

filename = sys.argv[1]
f = open(filename)

и замените его на это:

f = sys.stdin

Трудно сказать более конкретно, не видя скрипта, с которого вы начинаете.

4
ответ дан 6 December 2019 в 14:00
поделиться

В коде у вас есть такая строка:

if not len(args) == 1:

Что вы могли бы сделать там, так это проверить, нет ли у вас имени файла, и вместо него использовать "/dev/stdin" (в системе, которая это позволяет).

Другое решение - просто заменить:

if not len(args) == 1:
    parser.print_help()
    return None, None
else:
    input_file = args[0]

на

if not len(args) == 1:
    input_file = sys.stdin
else:
    input_file = open(args[0])

Это означает, конечно, что возвращаемый "input_file" уже не имя файла, а объект файла, что означает дальнейшие изменения в вызывающей функции.

Первое решение требует меньше модификаций, но более специфично для конкретной платформы, второе - больше работы, но должно работать на большем количестве систем.

0
ответ дан 6 December 2019 в 14:00
поделиться

Я предлагаю пойти сюда:

http://codaset.com/repo/python-markdown/tickets/new

И отправить заявку с просьбой добавить эту функцию. Для них это должно быть просто, и они могут захотеть пойти дальше и сделать это.

0
ответ дан 6 December 2019 в 14:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: