2011-05-10 12 views
6

Sé cómo detectar si se está redirigiendo el script stdout de Python (>) usando sys.stdout.isatty() pero hay una forma de descubrir qué se redirige ¿a?¿Hay alguna manera de averiguar el nombre del archivo al que se redirige stdout en Python?

Por ejemplo:

python my.py > somefile.txt

¿Hay una manera de descubrir el nombre somefile.txt en Windows y Linux?

+0

Si está interesado en el nombre del TTY, hay 'os.ttyname (fd)', que funciona cuando 'os.isatty (fd)' es 'True', y así, funciona solo en Unix. –

+1

¿Qué vas a hacer con la información? –

+0

@karl - Es para fines de registro. – Kev

Respuesta

10

Dudo que pueda hacerlo de una manera independiente del sistema. En Linux, las siguientes obras:

import os 
my_output_file = os.readlink('/proc/%d/fd/1' % os.getpid()) 
+0

¡Gracias !, funciona un regalo en Linux. Veo lo que quiere decir para que funcione en una plataforma independiente. – Kev

+1

Tenga en cuenta que el resultado de este enlace de lectura parece estar destinado principalmente para fines de visualización: si el archivo se elimina, tendrá el sufijo '' (eliminado) '' o si se trata de un conducto anónimo, puede obtener un nombre como ' "pipe: [1162005]" '. –

1

Si usted necesita una manera independiente de la plataforma para obtener el nombre del archivo, pasarlo como argumento y utilizar argparse (o optparse) para leer sus argumentos, no hacer confíe en la redirección de shell en absoluto.

Uso python my.py --output somefile.txt con código como:

parser = argparse.ArgumentParser() 
parser.add_argument('--output', # nargs='?', default=sys.stdout, 
        type=argparse.FileType('w'), 
        help="write the output to FILE", 
        metavar="FILE") 

args = parser.parse_args() 
filename = args.output.name 

Si conocer el nombre es opcional y se utiliza para una optimización raro, a continuación, utilizar la solución de Igor Nazarenko y comprobar que sys.platform es 'linux2', de lo contrario asumir que no lo hace tener el nombre y tratarlo como un tubo normal.

Cuestiones relacionadas