python: выяснить, работает ли он в оболочке или нет (например, очередь подсистемы подсистемы Sun) - PullRequest
7 голосов
/ 09 июня 2009

есть ли способ узнать из программы Python, запущена ли она в терминале или, например, в пакетном двигателе, как двигатель с решеткой от солнца?

Идея состоит в том, чтобы решить, печатать ли некоторые индикаторы выполнения и другие интерактивные материалы или нет.

спасибо!

р.

Ответы [ 4 ]

13 голосов
/ 09 июня 2009

Стандартный способ isatty().

import sys
if sys.stdout.isatty():
    print("Interactive")
else:
    print("Non-interactive")
6 голосов
/ 09 июня 2009

Вы можете использовать os.getppid(), чтобы узнать идентификатор процесса для родительского процесса этого, а затем использовать этот идентификатор процесса, чтобы определить, какая программа запущена этим процессом. Более полезно, вы могли бы использовать sys.stdout.isatty() - это не отвечает на ваш заглавный вопрос, но, кажется, лучше решает реальную проблему, которую вы объясняете (если вы работаете под оболочкой, но ваш вывод передается другому процессу или перенаправляется на файл, который вы, вероятно, не хотите создавать на нем «интерактивные материалы»).

3 голосов
/ 14 декабря 2011

немного короче:

import sys

sys.stdout.isatty()
2 голосов
/ 20 октября 2009

Я нашел следующее для работы как в 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!

НТН

...