我有一个程序,它接受用户的标准输入并通过命令行运行。有没有办法使程序忽略管道和重定向?
例如:python program.py < input.txt > output.txt
就像你放入python program.py
答案 0 :(得分:0)
在一般情况下,没有简单的方法可以找到用户启动的终端。您可以使用一些技术,但它们并不总是有效。
您可以使用os.isatty()
来检测文件(例如sys.stdin
或sys.stdout
)是否显示为交互式终端会话。您可能会连接到用户启动程序之外的终端会话,因此这不是万无一失的。这样的终端会议甚至可能在程序而不是人类的控制之下。
在Unix下,进程有一个“控制终端”的概念。您可以通过os.ctermid()
与之交谈。但是用户可以在启动进程之前操作此值。您也可能根本没有控制终端,例如如果作为守护进程运行。
您可以检查父进程并查看其任何文件描述符是否已连接到终端会话。不幸的是,我不知道有任何跨平台的方式来做到这一点。在Linux上,我从os.getppid()
和/proc
文件系统开始(参见proc(5)
)。如果父进程已退出(例如,用户在bash下运行your_program.py & disown; exit
),则无效。但在那种情况下,你无论如何也无能为力。