Eu tenho alguns scripts Python por aí e estou trabalhando para reescrevê-los. Eu tenho o mesmo problema com todos eles.
Não é óbvio para mim como escrever os programas para que eles se comportem como ferramentas unix apropriadas.
Porque isso
$ cat characters | progname
e isto
$ progname characters
deve produzir a mesma saída.
A coisa mais próxima que pude encontrar no Python foi a biblioteca de entrada de arquivos. Infelizmente, eu realmente não vejo como reescrever meus scripts Python, todos com a seguinte aparência:
#!/usr/bin/env python
# coding=UTF-8
import sys, re
for file in sys.argv[1:]:
f = open(file)
fs = f.read()
regexnl = re.compile('[^\s\w.,?!:;-]')
rstuff = regexnl.sub('', fs)
f.close()
print rstuff
A biblioteca fileinput processa stdin se houver um stdin e processa um arquivo se houver um arquivo. Mas ele itera sobre linhas únicas.
import fileinput
for line in fileinput.input():
process(line)
Eu realmente não entendo isso. Eu acho que se você estiver lidando com arquivos pequenos ou se não estiver fazendo muito com os arquivos, isso pode parecer óbvio. Mas, para meus propósitos, isso torna muito mais lento do que simplesmente abrir o arquivo inteiro e lê-lo em uma string, como acima.
Atualmente eu corro o script acima como
$ pythonscript textfilename1 > textfilename2
Mas eu quero poder executá-lo (e seus irmãos) em tubos, como
$ grep pattern textfile1 | pythonscript | pythonscript | pythonscript > textfile2