Python 如何判断函数是否从jupyter笔记本调用?

Python 如何判断函数是否从jupyter笔记本调用?,python,ipython,jupyter-notebook,spyder,Python,Ipython,Jupyter Notebook,Spyder,当我试图学习一些数据科学的编码时,我在Spyder和jupyter笔记本之间切换了一些。因此,我想找到一种方法来判断函数是从一个函数调用还是从另一个函数调用,这样我就可以停用脚本中仅用于笔记本电脑的部分。我认为,当我从Spyder运行代码时,以下类似内容可以省去%matplotlib inline部分: if __name__ != '__main__': %matplotlib inline print('Hello, jupyter') else: print('He

当我试图学习一些数据科学的编码时,我在Spyder和jupyter笔记本之间切换了一些。因此,我想找到一种方法来判断函数是从一个函数调用还是从另一个函数调用,这样我就可以停用脚本中仅用于笔记本电脑的部分。我认为,当我从Spyder运行代码时,以下类似内容可以省去
%matplotlib inline
部分:

if __name__ != '__main__':
    %matplotlib inline
    print('Hello, jupyter')
else:
    print('Hello, Spyder')
但是在这两种情况下,
\uu\u name\uu=\u main\uu
保持原样也会在Spyder中引发错误建议

我已经在这里测试了这些建议:。这是可行的,但我有点困惑,因为我也在Spyder中运行IPython控制台。另外,我希望你们中的一些人可能有其他的建议

谢谢大家!

似乎没有一种正确的或经得起未来考验的方法来实现这一点,但我会使用这种模式:

import os

if "JPY_PARENT_PID" in os.environ:
    print('Hello, jupyter')
else:
    print('Hello, Spyder')
它比给出的答案更具体,副作用更少。它在jupyter笔记本电脑和jupyter实验室工作,所以我认为可以安全地假设它将在一段时间内证明未来

让我知道它是如何为你工作的

更新: 上述解决方案仅适用于spyder>3.2的情况

不过,下面的解决方案可能适用于所有版本的jupyter笔记本或spyder。基本上,上面的if-else循环是相同的,但我们只是测试
os.environ
是否存在spyder之类的东西

import os

# spyder_env: was derived in spyder 3.2.8 ipython console running:
# [i for i in os.environ if i[:3] == "SPY"]

spyder_env = set(['SPYDER_ARGS',
                  'SPY_EXTERNAL_INTERPRETER',
                  'SPY_UMR_ENABLED',
                  'SPY_UMR_VERBOSE',
                  'SPY_UMR_NAMELIST',
                  'SPY_RUN_LINES_O',
                  'SPY_PYLAB_O',
                  'SPY_BACKEND_O',
                  'SPY_AUTOLOAD_PYLAB_O',
                  'SPY_FORMAT_O',
                  'SPY_RESOLUTION_O',
                  'SPY_WIDTH_O',
                  'SPY_HEIGHT_O',
                  'SPY_USE_FILE_O',
                  'SPY_RUN_FILE_O',
                  'SPY_AUTOCALL_O',
                  'SPY_GREEDY_O',
                  'SPY_SYMPY_O',
                  'SPY_RUN_CYTHON',
                  'SPYDER_PARENT_DIR'])

# Customize to account for spyder plugins running in jupyter notebook/lab.
n = 0


if "JPY_PARENT_PID" in os.environ:
    # Compare the current os.environ.keys() to the known spyder os.environ.
    overlap = spyder_env & set(os.environ.keys())

    if len(overlap) == n:
        print('Hello, jupyter')   

    # This could be a more specific elif statment if needed.
    else:
        print('Hello, Spyder')

这能为您解决问题吗?

我想我找到了一个更简单的解决方案:

def test_ipkernel():
    import sys

    which = 'IS' if 'ipykernel_launcher.py' in sys.argv[0] else 'IS NOT'
    msg = f'Code *{which}* running in Jupyter platform (notebook, lab, etc.)'       
    print(msg)
如果我在JuyterLab中运行该函数,则输出为:

Code *IS* running in Jupyter platform (notebook, lab, etc.)
在VS代码中,它是:

Code *IS NOT* running in Jupyter platform (notebook, lab, etc.)

谢谢你的回答。我会尽快检查。(这里是Spyder维护人员)由于我们的3.2版本,Spyder只使用与Jupyter相同的体系结构,所以这不起作用,即为Jupyter笔记本和Spyder定义了
JPY\u PARENT\u PID
。事实上,Jupyter团队有意识地决定,不可能判断哪种接口(基于Qt或JS)连接到内核。因此,没有可靠的测试来区分Spyder和笔记本电脑。Spyder现在正在集成jupyter的东西,这很酷,但这确实使这个问题非常困难,甚至不可能解决。Spyder也在运行JS吗?有没有可能通过某种JS黑客来确定env?@CarlosCordoba我已经更新了我的答案,我很想听听你的想法。