Скрипт Python, который я должен запустить, берет вход только из файла, переданного как параметр командной строки, как так:
$ markdown.py input_file
Там какой-либо путь состоит в том, чтобы заставить это принимать вход от STDIN вместо этого? Я хочу смочь сделать это через Bash, значительно не изменяя сценарий Python:
$ echo "Some text here" | markdown.py
Если бы я должен изменить сценарий Python, как я пошел бы об этом?
(РЕДАКТИРОВАНИЕ: Вот сценарий, который анализирует параметры командной строки.)
Я не уверен, насколько он портативен, но в системах Unix-y вы можете назвать / dev / stdin
в качестве своего файла:
$ echo -n hi there | wc /dev/stdin
0 2 8 /dev/stdin
Я предполагаю, исходя из деталей вашего вопроса, который вы задаете о 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
. , это не так-то просто. Здесь я собирался предложить использовать специальный файл, как это сделал Марк Рушаков, если бы он меня не опередил; -)
Убедитесь, что это находится в верхней части файла:
import sys
Затем найдите что-то вроде этого:
filename = sys.argv[1]
f = open(filename)
и замените его на это:
f = sys.stdin
Трудно сказать более конкретно, не видя скрипта, с которого вы начинаете.
В коде у вас есть такая строка:
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" уже не имя файла, а объект файла, что означает дальнейшие изменения в вызывающей функции.
Первое решение требует меньше модификаций, но более специфично для конкретной платформы, второе - больше работы, но должно работать на большем количестве систем.
Я предлагаю пойти сюда:
http://codaset.com/repo/python-markdown/tickets/new
И отправить заявку с просьбой добавить эту функцию. Для них это должно быть просто, и они могут захотеть пойти дальше и сделать это.