2011-05-10 113 views
6

我知道如何檢測我的Python腳本的stdout是否被重定向(>)使用sys.stdout.isatty(),但有沒有辦法發現它被重定向至?有沒有辦法找出文件stdout的名稱被重定向到Python

例如:

python my.py > somefile.txt

有沒有一種方法來發現名稱somefile.txt在Windows和Linux呢?

+0

如果你有興趣在TTY的名字,還有'os.ttyname(FD)','時os.isatty(FD)''是TRUE',喜歡它,只能在Unix其工作。 – 2011-05-10 00:41:22

+1

你打算怎麼處理這些信息? – 2011-05-10 05:26:28

+0

@karl - 這是記錄的目的。 – Kev 2011-05-10 12:56:15

回答

10

我懷疑你可以做,在一個系統無關的方式。在Linux上,以下工作:

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

感謝!在Linux上工作一種享受。我明白你的意思是讓它以平臺獨立的方式工作。 – Kev 2011-05-10 00:20:57

+1

注意從這裏的readlink結果似乎主要用於顯示目的:如果文件被刪除,它會與'爲後綴「(刪除)」'或者如果它是一個匿名管道,你可能會得到這樣的'一個名稱「管:[1162005]」'。 – 2011-05-10 00:32:59

1

如果你需要一個獨立於平臺的方式來獲得文件的名稱,它作爲參數傳遞,並使用argparse(或optparse)來讀取你的論點,不完全依賴shell重定向。

使用python my.py --output somefile.txt的代碼,如:

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 

如果知道名稱是可選的,使用一些奇怪的優化,然後用伊戈爾·納扎連科的解決方案,並檢查sys.platform'linux2',否則假定你不有名字並把它當作正常的管道。

相關問題