7

Python プログラムがターミナルで開始されたのか、それとも Sun Grid Engine のようなバッチ エンジンで開始されたのかを調べる方法はありますか?

アイデアは、いくつかのプログレスバーやその他のASCIIインタラクティブなものを印刷するかどうかを決定することです。

ありがとう!

p。

4

4 に答える 4

12

標準的な方法はisatty().

import sys
if sys.stdout.isatty():
    print("Interactive")
else:
    print("Non-interactive")
于 2009-06-08T22:39:50.420 に答える
6

を使用os.getppid()して、このプロセスの親プロセスのプロセス ID を見つけ、そのプロセス ID を使用して、そのプロセスが実行しているプログラムを特定できます。もっと便利に、sys.stdout.isatty()-- これはタイトルの質問には答えませんが、説明する実際の問題をより適切に解決するように見えます(シェルで実行しているが、出力が他のプロセスにパイプされているか、ファイルにリダイレクトされている場合)おそらく、「インタラクティブなもの」も発行したくないでしょう)。

于 2009-06-08T22:39:46.193 に答える
3

少し短い:

import sys

sys.stdout.isatty()
于 2011-12-14T05:26:44.877 に答える
2

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!

HTH

于 2009-10-19T22:14:47.890 に答える