有没有办法从 python 程序中找出它是在终端中启动的,还是在像 sun Grid 引擎这样的批处理引擎中启动的?
这个想法是决定是否打印一些进度条和其他 ascii 交互式内容。
谢谢!
页。
标准方式是isatty()
.
import sys
if sys.stdout.isatty():
print("Interactive")
else:
print("Non-interactive")
您可以使用os.getppid()
来找出该进程的父进程的进程 ID,然后使用该进程 ID 来确定该进程正在运行的程序。更有用的是,您可以使用sys.stdout.isatty()
-- 这不能回答您的标题问题,但似乎可以更好地解决您解释的实际问题(如果您在 shell 下运行,但您的输出通过管道传输到其他进程或重定向到您的文件可能也不想在其上发出“交互式内容”)。
略短:
import sys
sys.stdout.isatty()
我发现以下内容适用于 Linux 和 Windows,在普通的 Python 解释器和 IPython 中(虽然我不能说 IronPython):
isInteractive = hasattr(sys, 'ps1') or hasattr(sys, 'ipcompleter')
但是,请注意,使用ipython时,如果将文件指定为命令行参数,它将在解释器变为交互式之前运行。看看我在下面的意思:
C:\>cat C:\demo.py
import sys, os
# ps1=python shell; ipcompleter=ipython shell
isInteractive = hasattr(sys, 'ps1') or hasattr(sys, 'ipcompleter')
print isInteractive and "This is interactive" or "Automated"
C:\>python c:\demo.py
Automated
C:\>python
>>> execfile('C:/demo.py')
This is interactive
C:\>ipython C:\demo.py
Automated # NOTE! Then ipython continues to start up...
IPython 0.9.1 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object'. ?object also works, ?? prints more.
In [2]: run C:/demo.py
This is interactive # NOTE!
高温高压