Python

2011-05-10 7 views
6

'da yönlendirilen dosyanın adını bulmanın bir yolu var. Python betiğimin stdout'unun sys.stdout.isatty() kullanarak yeniden yönlendirilip (>) yönlendirildiğini nasıl algılayacağımı biliyorum, ancak yeniden yönlendirmenin ne olduğunu keşfetmenin bir yolu var mı? için? ÖrneğinPython

:

python my.py > somefile.txt

adını Windows hem de Linux üzerinde somefile.txt keşfetmek için bir yolu var mı?

+0

Eğer TTY'nin adıyla ilgileniyorsanız, os.isatty (fd) '' True' olduğunda ve bunun gibi sadece Unix’te çalıştığı zaman 'os.ttyname (fd)' 'dır. –

+1

Bu bilgilerle ne yapacaksınız? –

+0

@karl - Günlüğe kaydetme amaçlıdır. – Kev

cevap

10

Bunu sistemden bağımsız şekilde yapabileceğinizden şüpheliyim. Eğer dosyanın adını almak bağımsız değişken olarak geçmek ve argparse kullanmak (veya optparse) argümanlarınızı okumak için bir platformdan bağımsız bir şekilde gerekirse

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

Teşekkürler! Linux üzerinde bir muamele çalışıyor. Platformdan bağımsız bir şekilde çalışmasını sağlamak için ne demek istediğini görüyorum. – Kev

+1

Bu readlink'in sonucunun daha çok görüntüleme amacıyla tasarlandığına dikkat edin: Dosya silindiyse, "" (silindi) "ile sona erer veya adsız bir boruysa, "boru: [1162005]" '. –

1

, yapma: Linux, aşağıdaki işleri üzerinde kabuk yeniden yönlendirmeye güveniyor.

ile kullanın python my.py --output somefile.txt kodu gibi:

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 

adını bilerek opsiyonel ve bazı garip optimizasyonu için kullanılan ise, o başka türlü değil mi varsayalım, Igor Nazarenko en çözümünü kullanabilir ve sys.platform'linux2' olup olmadığını kontrol adını al ve normal bir boru olarak davran.