Autant que je sache, voici 3 types d'ipython qui utilisaient ipykernel
ipython qtconsole
("qtipython" pour faire court)
- IPython dans spyder ("spyder" pour faire court)
- IPython dans le notebook jupyter ("jn" pour faire court)
utilisation 'spyder' in sys.modules
peut distinguer spyder
mais pour qtipython et jn sont difficiles à distinguer cause
ils ont la même sys.modules
et la même configuration IPython:get_ipython().config
Je trouve un différent entre qtipython et jn:
première exécution os.getpid()
dans le shell IPython obtenir le numéro pid
puis courir ps -ef|grep [pid number]
mon pid qtipython est 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
mon jn pid est 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
le différent de qtipython et jn est le nom json d'ipython, le nom json de jn est plus long que celui de qtipython
Ainsi, nous pouvons détecter automatiquement tout l'environnement Python en suivant le code:
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)
le code source est ici: Détection de l'environnement Python, surtout distinguer Spyder, notebook Jupyter, Qtconsole.py