6

我知道如何检测我的 Python 脚本stdout是否被重定向(>)使用sys.stdout.isatty(),但是有没有办法发现它被重定向到什么?

例如:

python my.py > somefile.txt

有没有办法somefile.txt在 Windows 和 Linux 上发现这个名字?

4

2 回答 2

10

我怀疑你可以以独立于系统的方式做到这一点。在 Linux 上,以下工作:

import os
my_output_file = os.readlink('/proc/%d/fd/1' % os.getpid())
于 2011-05-10T00:14:58.783 回答
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',否则假设您没有名称并将其视为普通管道。

于 2011-05-10T00:23:33.073 回答