111

ターミナルの Python / IPython または IPython ノートブックで実行すると、何か違うことをするはずの Python コードの例を共有したいと思います。

Python コードが IPython ノートブックで実行されているかどうかを確認するにはどうすればよいですか?

4

14 に答える 14

93

以下は私のニーズに合っていました:

get_ipython().__class__.__name__

Jupyter (ノートブックと qtconsole)'TerminalInteractiveShell'の端末 IPythonに戻り、通常の Python インタープリターでは失敗します ()。このメソッドは、IPython の起動時にデフォルトでグローバル名前空間で使用できるようです。'ZMQInteractiveShell'NameErrorget_python()

それを単純な関数にラップします。

def isnotebook():
    try:
        shell = get_ipython().__class__.__name__
        if shell == 'ZMQInteractiveShell':
            return True   # Jupyter notebook or qtconsole
        elif shell == 'TerminalInteractiveShell':
            return False  # Terminal running IPython
        else:
            return False  # Other type (?)
    except NameError:
        return False      # Probably standard Python interpreter

上記は、macOS 10.12 および Ubuntu 14.04.4 LTS 上の Python 3.5.2、IPython 5.1.0、および Jupyter 4.2.1 でテストされています。

于 2016-09-23T13:43:35.997 に答える
38

次のスニペット[1]を使用して、 Python がインタラクティブモードであるかどうかを確認できます。

def is_interactive():
    import __main__ as main
    return not hasattr(main, '__file__')

ノートブックで多くのプロトタイピングを行っているため、この方法は非常に便利です。テスト目的で、デフォルトのパラメーターを使用します。それ以外の場合は、からパラメーターを読み取りますsys.argv

from sys import argv

if is_interactive():
    params = [<list of default parameters>]
else:
    params = argv[1:]

の実装に続いてautonotebook、次のコードを使用してノートブックにいるかどうかを確認できます。

def in_notebook():
    try:
        from IPython import get_ipython
        if 'IPKernelApp' not in get_ipython().config:  # pragma: no cover
            return False
    except ImportError:
        return False
    except AttributeError:
        return False
    return True
于 2014-03-15T14:05:07.860 に答える
4

問題は、何を別の方法で実行したいかです。

IPythonで最善を尽くして、カーネルがどの種類のフロントエンドに接続されているかを認識しないようにします。実際には、カーネルを同時に多くの異なるフロントエンドに接続することもできます。stderr/outZMQカーネルを使用しているかどうかを知るためにタイプを確認できたとしても、反対側にあるものを保証するものではありません。フロントエンドがまったくない可能性もあります。

おそらくフロントエンドに依存しない方法でコードを書く必要がありますが、異なるものを表示したい場合は、リッチディスプレイシステム(IPythonのバージョン4.xに固定されたリンク)を使用して、フロントエンドに応じて異なるものを表示できますが、ライブラリではなく、フロントエンドが選択します。

于 2013-03-14T14:56:28.810 に答える
2

私の知る限り、ここには3種類のipythonが使用されていますipykernel

  1. ipython qtconsole(略して「qtipython」)
  2. スパイダーの IPython (略して「スパイダー」)
  3. jupyter ノートブックの IPython (略して「jn」)

使用'spyder' in sys.modulesするとスパイダーを区別できます

しかし、qtipython と jn を区別するのは難しいため、

それらは同じsys.modulesおよび同じ IPython 構成を持っています:get_ipython().config

qtipythonとjnの違いを見つけました:

os.getpid()pid番号を取得するためにIPythonシェルで最初に実行します

次に実行しますps -ef|grep [pid number]

私のqtipython pidは8699です

yanglei   8699  8693  4 20:31 ?        00:00:01 /home/yanglei/miniconda2/envs/py3/bin/python -m ipykernel_launcher -f /run/user/1000/jupyter/kernel-8693.json

私のjn pidは8832です

yanglei   8832  9788 13 20:32 ?        00:00:01 /home/yanglei/miniconda2/bin/python -m ipykernel_launcher -f /run/user/1000/jupyter/kernel-ccb962ec-3cd3-4008-a4b7-805a79576b1b.json

qtipython と jn の違いは ipython の json 名であり、jn の json 名は qtipython のものより長い

したがって、次のコードを使用してすべての Python 環境を自動検出できます。

import sys,os
def jupyterNotebookOrQtConsole():
    env = 'Unknow'
    cmd = 'ps -ef'
    try:
        with os.popen(cmd) as stream:
            if not py2:
                stream = stream._stream
            s = stream.read()
        pid = os.getpid()
        ls = list(filter(lambda l:'jupyter' in l and str(pid) in l.split(' '), s.split('\n')))
        if len(ls) == 1:
            l = ls[0]
            import re
            pa = re.compile(r'kernel-([-a-z0-9]*)\.json')
            rs = pa.findall(l)
            if len(rs):
                r = rs[0]
                if len(r)<12:
                    env = 'qtipython'
                else :
                    env = 'jn'
        return env
    except:
        return env
    
pyv = sys.version_info.major
py3 = (pyv == 3)
py2 = (pyv == 2)
class pyi():
    '''
    python info
    
    plt : Bool
        mean plt avaliable
    env :
        belong [cmd, cmdipython, qtipython, spyder, jn]
    '''
    pid = os.getpid()
    gui = 'ipykernel' in sys.modules
    cmdipython = 'IPython' in sys.modules and not gui
    ipython = cmdipython or gui
    spyder = 'spyder' in sys.modules
    if gui:
        env = 'spyder' if spyder else jupyterNotebookOrQtConsole()
    else:
        env = 'cmdipython' if ipython else 'cmd'
    
    cmd = not ipython
    qtipython = env == 'qtipython'
    jn = env == 'jn'
    
    plt = gui or 'DISPLAY' in os.environ 

print('Python Envronment is %s'%pyi.env)

ソース コードはここにあります:検出 Python 環境、特に Spyder、Jupyter ノートブック、Qtconsole.py を区別します。

于 2018-05-08T12:53:23.653 に答える