如何获取 python 脚本来区分输出是通过管道还是流程替换
How to get python script to differentiate if output is going to pipe vs. process substitution
尝试区分 stdout 是通过管道还是进程替换。
my_python_script.py
#!/usr/bin/python3.6
if sys.__stdin__.isatty():
print("__stdin__ is TTY")
else:
print("__stdin__ is not TTY")
if sys.__stdout__.isatty():
print("__stdout__ is TTY")
else:
print("__stdout__ is not TTY")
if sys.__stderr__.isatty():
print("__stderr__ is TTY")
else:
print("__stderr__ is not TTY")
if sys.stdin.isatty():
print("stdin is TTY")
else:
print("stdin is not TTY")
if sys.stdout.isatty():
print("stdout is TTY")
else:
print("stdout is not TTY")
if sys.stderr.isatty():
print("stderr is TTY")
else:
print("stderr is not TTY")
如果管道或进程替换,下面的输出是相同的。
> my_python_script.py | cat
__stdin__ is TTY
__stdout__ is not TTY
__stderr__ is TTY
stdin is TTY
stdout is not TTY
stderr is TTY
> cat <(my_python_script.py)
__stdin__ is TTY
__stdout__ is not TTY
__stderr__ is TTY
stdin is TTY
stdout is not TTY
stderr is TTY
有没有办法区分 python 脚本中的管道输出与进程替换?
谢谢
进程替换创建命名管道。
$ echo <(uptime)
/dev/fd/63
$ file <(uptime)
/dev/fd/63: broken symbolic link to pipe:[11474138]
所以答案是否定的。
以下脚本应区分两种情况:
import os
import re
import sys
def get_fds(id):
fds = [os.path.realpath(f"/proc/{id}/fd/{i}")
for i in list(os.walk(f'/proc/{id}/fd'))[0][2]]
return [re.sub('.*/', '', i)
for i in fds if "pipe" in i]
if any(i == j for i in get_fds(os.getpid())
for j in get_fds(os.getppid())):
print("Process substitution", file=sys.stderr)
else:
print("Normal pipe", file=sys.stderr)
尝试区分 stdout 是通过管道还是进程替换。
my_python_script.py
#!/usr/bin/python3.6
if sys.__stdin__.isatty():
print("__stdin__ is TTY")
else:
print("__stdin__ is not TTY")
if sys.__stdout__.isatty():
print("__stdout__ is TTY")
else:
print("__stdout__ is not TTY")
if sys.__stderr__.isatty():
print("__stderr__ is TTY")
else:
print("__stderr__ is not TTY")
if sys.stdin.isatty():
print("stdin is TTY")
else:
print("stdin is not TTY")
if sys.stdout.isatty():
print("stdout is TTY")
else:
print("stdout is not TTY")
if sys.stderr.isatty():
print("stderr is TTY")
else:
print("stderr is not TTY")
如果管道或进程替换,下面的输出是相同的。
> my_python_script.py | cat
__stdin__ is TTY
__stdout__ is not TTY
__stderr__ is TTY
stdin is TTY
stdout is not TTY
stderr is TTY
> cat <(my_python_script.py)
__stdin__ is TTY
__stdout__ is not TTY
__stderr__ is TTY
stdin is TTY
stdout is not TTY
stderr is TTY
有没有办法区分 python 脚本中的管道输出与进程替换?
谢谢
进程替换创建命名管道。
$ echo <(uptime)
/dev/fd/63
$ file <(uptime)
/dev/fd/63: broken symbolic link to pipe:[11474138]
所以答案是否定的。
以下脚本应区分两种情况:
import os
import re
import sys
def get_fds(id):
fds = [os.path.realpath(f"/proc/{id}/fd/{i}")
for i in list(os.walk(f'/proc/{id}/fd'))[0][2]]
return [re.sub('.*/', '', i)
for i in fds if "pipe" in i]
if any(i == j for i in get_fds(os.getpid())
for j in get_fds(os.getppid())):
print("Process substitution", file=sys.stderr)
else:
print("Normal pipe", file=sys.stderr)