我知道如何檢測我的Python腳本的stdout
是否被重定向(>
)使用sys.stdout.isatty()
,但有沒有辦法發現它被重定向至?有沒有辦法找出文件stdout的名稱被重定向到Python
例如:
python my.py > somefile.txt
有沒有一種方法來發現名稱somefile.txt
在Windows和Linux呢?
我知道如何檢測我的Python腳本的stdout
是否被重定向(>
)使用sys.stdout.isatty()
,但有沒有辦法發現它被重定向至?有沒有辦法找出文件stdout的名稱被重定向到Python
例如:
python my.py > somefile.txt
有沒有一種方法來發現名稱somefile.txt
在Windows和Linux呢?
我懷疑你可以做,在一個系統無關的方式。在Linux上,以下工作:
import os
my_output_file = os.readlink('/proc/%d/fd/1' % os.getpid())
感謝!在Linux上工作一種享受。我明白你的意思是讓它以平臺獨立的方式工作。 – Kev 2011-05-10 00:20:57
注意從這裏的readlink結果似乎主要用於顯示目的:如果文件被刪除,它會與'爲後綴「(刪除)」'或者如果它是一個匿名管道,你可能會得到這樣的'一個名稱「管:[1162005]」'。 – 2011-05-10 00:32:59
如果你需要一個獨立於平臺的方式來獲得文件的名稱,它作爲參數傳遞,並使用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'
,否則假定你不有名字並把它當作正常的管道。
如果你有興趣在TTY的名字,還有'os.ttyname(FD)','時os.isatty(FD)''是TRUE',喜歡它,只能在Unix其工作。 – 2011-05-10 00:41:22
你打算怎麼處理這些信息? – 2011-05-10 05:26:28
@karl - 這是記錄的目的。 – Kev 2011-05-10 12:56:15