2011-05-10 47 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',否则假定你不有名字并把它当作正常的管道。

相关问题