Я понимаю, что мой вопрос очень простой, но я не могу найти явного примера реализации stdin stdout в скрипте Python.
У меня есть скрипт, отлично работающий с аргументами командной строки:
newlist = []
def f1()
....
def f2(input_file):
vol_id = sys.argv[3]
for line in input_file:
if ... :
line = line.replace('abc','def')
line = line.replace('id', 'id'+vol_id)
....
newlist.append(line)
return newlist
def main():
if len(sys.argv) < 4:
print 'usage: ./myscript.py [file_in... file_out... volume_id]'
sys.exit(1)
else:
filename = sys.argv[1]
filename_out = sys.argv[2]
tree = etree.parse(filename)
extract(tree)
input_file = open(filename, 'rU')
change_class(input_file)
file_new = open(filename_out, 'w')
for x in newlist:
if '\n' in x:
x = x.replace('\n', '')
print>>file_new, x
Теперь я должен каким-то образом использовать stdin и stdout вместо моих аргументов, чтобы мой скрипт можно было использовать в конвейерах, например, используя несколько файлов в качестве входных данных:
кошка ввод1 ввод1 ввод3 | myscript.py
Или обработать его вывод с помощью некоторых инструментов UNIX перед его печатью в файл. Я попытался заменить аргументы в своем скрипте на sys.stdin:
filename = sys.stdin
filename_out = sys.stdout
Затем я запустил свой скрипт следующим образом:
./myscript.py ‹ входной файл > выходной файл
Это привело к пустому выходному файлу, но вообще не выдало никаких сообщений об ошибках.
Не могли бы вы помочь мне с этой заменой?
P.S. Затем я изменил свой main() следующим образом:
filename = sys.argv[1]
filename_out = sys.argv[2]
if filename == '-':
filename = sys.stdin
else:
input_file = open(filename, 'rU')
if filename_out == '-':
filename_out = sys.stdout
file_new = filename_out
else:
file_new = open(filename_out, 'w')
tree = etree.parse(filename)
extract(tree)
input_file = filename
change_class(input_file)
for x in newlist:
if '\n' in x:
x = x.replace('\n', '')
print>>file_new, x
Я попытался запустить его из командной строки следующим образом:
./myscript.py - - volumeid < filein > fileout
Но у меня все еще есть пустой выходной файл :(
fileinput
(в стандартной библиотеке). - person cdarke   schedule 20.02.2014fileinput
отлично подходит, когда у вас есть только входные файлы. Вам все равно придется вручную обрабатывать аргументы командной строки и явно передавать файлы, которыеfileinput
следует рассматривать как входные данные. - person Martijn Pieters   schedule 20.02.2014