有没有办法在Python中找出stdout重定向到哪个文件的名称

6 投票
2 回答
1055 浏览
提问于 2025-04-16 17:19

我知道怎么判断我的Python脚本的输出(stdout)是否被重定向了(比如用>符号),可以通过sys.stdout.isatty()来实现。但是有没有办法知道它被重定向到了哪里呢?

举个例子:

python my.py > somefile.txt

有没有办法在Windows和Linux上都找到这个文件的名字,比如somefile.txt

2 个回答

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

如果获取文件名是可选的,并且只是为了某种奇怪的优化,那么可以参考Igor Nazarenko的解决方案,检查一下sys.platform是否是'linux2',如果不是,就假设你没有文件名,把它当作普通的管道来处理。

10

我怀疑你能否以一种不依赖于系统的方式做到这一点。在Linux系统上,下面的代码是可以运行的:

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

撰写回答