我知道如何检测我的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