python - 如何判断是否从 jupyter notebook 调用了一个函数?

标签 python ipython jupyter-notebook spyder

当我尝试学习一些数据科学编码时,我在 Spyder 和 jupyter notebooks 之间切换了一下。因此,我想找到一种方法来判断一个函数是从一个还是另一个调用,这样我就可以停用脚本中仅供笔记本使用的部分。当我从 Spyder 运行代码时,我认为像下面这样的东西可以省略 %matplotlib inline 部分:

if __name__ != '__main__':
    %matplotlib inline
    print('Hello, jupyter')
else:
    print('Hello, Spyder')

但是 __name__ = _main__ 在这两种情况下,并且保留 %matplotlib inline 也会在 Spyder 中引发错误建议。

我已经测试了这里的建议:How to check if you are in a Jupyter notebook .这行得通,但我有点困惑,因为我也在 Spyder 中运行 IPython 控制台。另外,我希望你们中的一些人可能有其他建议!

谢谢!

最佳答案

似乎没有正确的或面向 future 的方法来实现这一目标,但我会使用这种模式:

import os

if "JPY_PARENT_PID" in os.environ:
    print('Hello, jupyter')
else:
    print('Hello, Spyder')

与给定的答案 here 相比,它更具体一点并且副作用更少.它适用于 jupyter notebook 和 jupyter lab,所以我认为可以安全地假设它会在未来一段时间内经得起考验。

让我知道它是如何为您服务的。

更新:

上面的解决方案只适用于spyder >3.2

但是,下面的解决方案可能适用于所有版本的 jupyter notebook 或 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')

这能解决您的问题吗?

关于python - 如何判断是否从 jupyter notebook 调用了一个函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47052861/

相关文章:

apache-spark - 在 Spark 中显示 <IPython.core.display.HTML object>

python - 在 python list(map(...)) 中跟踪进度

python - 没有 shell 提示消息,只是在将 Python 脚本作为守护进程启动后出现闪烁的光标?

python - 解析像request.Request.url这样准备好的url

python - 如何绘制 100% 堆积条形图

python - 重置下划线 (`_` ) 由 IPython 内核驱动的 Jupyter 笔记本中的变量

python - 在 Jupyter Notebook 中以正确的顺序获取日志输出和标准输出

python - 这个特定参数如何接收值?

python - 为什么 set 的 ipython 输出与 set 的 __repr__ 或 __str__ 不同?

python - 如何在 Python IDE : Spyder? 中缩进代码块