ターミナルの Python / IPython または IPython ノートブックで実行すると、何か違うことをするはずの Python コードの例を共有したいと思います。
Python コードが IPython ノートブックで実行されているかどうかを確認するにはどうすればよいですか?
ターミナルの Python / IPython または IPython ノートブックで実行すると、何か違うことをするはずの Python コードの例を共有したいと思います。
Python コードが IPython ノートブックで実行されているかどうかを確認するにはどうすればよいですか?
以下は私のニーズに合っていました:
get_ipython().__class__.__name__
Jupyter (ノートブックと qtconsole)'TerminalInteractiveShell'
の端末 IPythonに戻り、通常の Python インタープリターでは失敗します ()。このメソッドは、IPython の起動時にデフォルトでグローバル名前空間で使用できるようです。'ZMQInteractiveShell'
NameError
get_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 でテストされています。
次のスニペット[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
問題は、何を別の方法で実行したいかです。
IPythonで最善を尽くして、カーネルがどの種類のフロントエンドに接続されているかを認識しないようにします。実際には、カーネルを同時に多くの異なるフロントエンドに接続することもできます。stderr/out
ZMQカーネルを使用しているかどうかを知るためにタイプを確認できたとしても、反対側にあるものを保証するものではありません。フロントエンドがまったくない可能性もあります。
おそらくフロントエンドに依存しない方法でコードを書く必要がありますが、異なるものを表示したい場合は、リッチディスプレイシステム(IPythonのバージョン4.xに固定されたリンク)を使用して、フロントエンドに応じて異なるものを表示できますが、ライブラリではなく、フロントエンドが選択します。
私の知る限り、ここには3種類のipythonが使用されていますipykernel
ipython qtconsole
(略して「qtipython」)使用'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 を区別します。