python: узнать, работает ли он в оболочке или нет (например, очередь механизма солнечной сетки)

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

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

Благодарность!

p.


person Community    schedule 08.06.2009    source источник
comment
Добро пожаловать на сайт, Павел. Если какой-либо из приведенных ниже ответов решит вашу проблему, вы можете официально принять тот, который, по вашему мнению, является лучшим ответом; ответивший получает несколько дополнительных баллов, и это помогает будущим посетителям найти лучшее решение.   -  person Jarret Hardie    schedule 09.06.2009
comment
кстати, как насчет запуска printenv в задании и просмотра того, какие переменные среды устанавливаются Sun Grid Engine (например, номер задания), которые не устанавливаются во время типичной интерактивной оболочки?   -  person Andre Holzner    schedule 27.08.2011
comment
Возможный дубликат Проверка интерактивной оболочки в скрипте Python   -  person ideasman42    schedule 29.08.2017


Ответы (4)


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

import sys
if sys.stdout.isatty():
    print("Interactive")
else:
    print("Non-interactive")
person Dietrich Epp    schedule 08.06.2009
comment
спасибо большое, работает как надо! именно то, что я искал. п. - person ; 09.06.2009

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

person Alex Martelli    schedule 08.06.2009
comment
спасибо за объяснение, Алексей! это мне очень помогает! п. - person ; 09.06.2009

Чуть короче:

import sys

sys.stdout.isatty()
person Andy Grover    schedule 14.12.2011

Я обнаружил, что следующее работает как в 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!

ХТН

person Roark Fan    schedule 19.10.2009