2010-07-17 15 views
7

un script en Python que necesito para funcionar toma la entrada sólo desde un fichero pasado como argumento de línea de comandos, así:Forzar a un script en Python para tomar la entrada de STDIN

$ markdown.py input_file 

¿Hay alguna forma de conseguir que se aceptar la entrada de STDIN en su lugar? Quiero ser capaz de hacer esto a través del golpe, sin modificar significativamente el script en Python:

$ echo "Some text here" | markdown.py 

Si tengo que modificar el script Python, ¿cómo podría hacerlo?

(EDIT: Here es el script que está analizando las opciones de línea de comandos.)

Respuesta

11

no estoy seguro de cómo portátil que es, pero en sistemas tipo Unix y Puede nombrar /dev/stdin que el archivo:

$ echo -n hi there | wc /dev/stdin 
     0  2  8 /dev/stdin 
+0

¡Gracias! Esto es exactamente lo que estaba buscando. – Karthik

4

Asegúrese de que esto es cerca de la parte superior del archivo:

import sys 

luego buscar algo como esto:

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

y sustituirla por la siguiente:

f = sys.stdin 

Es difícil ser más específico sin ver el script con el que está empezando.

+0

[aquí] (http://codaset.com/repo/python-markdown/source/master/blob/067d88bc41c7924c9087b724ff5247235243ce6b/markdown/commandline.py) es el archivo. Utiliza el módulo optparse, por lo que no hay sys.argv []. – Karthik

0

En el código que tiene una línea como esta:

if not len(args) == 1: 

Lo que podría hacer allí es verificar si no tiene un nombre de archivo y en su lugar usar "/ dev/stdin" (en un sistema que lo permita).

Otra solución es simplemente reemplazar:

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

con

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

Eso significa, por supuesto, que la devolvió "archivo_entrada" ya no es un nombre de archivo, sino un objeto de archivo, lo que significa más modificaciones en la función de llamada.

La primera solución es menos modificaciones pero más específicas de la plataforma, en segundo lugar es más trabajo, pero debería funcionar en más sistemas.

0

Supongo por los detalles de su pregunta que está preguntando sobre Python-Markdown, así que rastreé la línea correspondiente en el código fuente para usted: para hacerlo a la manera de Daniel, en la línea 443 de markdown/__init__.py, que le desea reemplazar

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

con

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

Aunque entonces no sería capaz de procesar archivos realidad después, por lo que para un corte más útil en general, se puede poner en un condicional:

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

y entonces tendría que ajustar markdown/commandline.py a no dejar de fumar si no se le da un nombre de archivo: Líneas de cambio 72-73

parser.print_help() 
return None, None 

a

input_file = None 

El punto es , no es realmente una cosa simple de hacer. En este punto yo iba a sugerir el uso de un archivo especial como Mark Rushakoff hizo, si no me había adelantado ;-)

0

Yo te sugeriría ir aquí:

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

Y la presentación de una ticket solicitando que agreguen la característica. Debería ser sencillo para ellos y, por lo tanto, podrían estar dispuestos a seguir adelante y hacerlo.

+0

Ese sitio parece algo muerto, creo que podría ser una idea más fructífera ir a su [Proyecto Gitorious] (http://gitorious.org/python-markdown), implementar el cambio en una sucursal y solicitar que se complete. ser incorporado al proyecto. –

0

En bash, también se puede utilizar process substitution:

markdown.py <(echo "Some text here") 

Para una sola entrada/obras dev/stdin, pero la sustitución proceso también se aplica para varios insumos (e incluso salidas)

Cuestiones relacionadas