【问题标题】:Running Python startup code after modules are loaded加载模块后运行 Python 启动代码
【发布时间】:2017-03-29 12:31:51
【问题描述】:

我正在使用带有 SparkContext 的 Jupyter 笔记本和 Python 内核。一位同事编写了一些 Python 代码,将 Spark 事件与 ipykernel 事件联系起来。当我们从笔记本单元导入他的模块时,它可以在我们需要支持的所有组合中工作:Python 2.7 和 3.5、Spark 1.6 和 2.x,仅限 Linux。

现在我们要为所有 Python 内核自动启用该代码。我将导入放入我们的sitecustomize.py。这适用于 Spark 2.x,但不适用于 Spark 1.6。带有 Spark 1.6 的内核不再获得 sc,而且有些事情搞砸了,以至于像 matplotlib.cbook 这样的不相关的导入失败了。当我使用计时器将导入延迟几秒钟时,它可以工作。 显然,sitecustomize.py 中的代码执行得太早,无法导入连接 Spark 和 ipykernel 的模块。

我正在寻找一种方法来延迟导入,直到 Spark 和/或 ipykernel 完全初始化。但它仍应作为内核启动的一部分在执行任何笔记本单元之前执行。 我发现this trick 延迟代码执行直到sys.argv 被初始化。但我不认为它可以处理像sc 这样的全局变量,因为Python 全局变量仍然是模块的本地变量。到目前为止,我能想到的最好方法是使用计时器每秒检查 sys.modules 中是否存在某些模块。但这不是很可靠,因为我不知道如何区分完全初始化的模块和仍在加载的模块。

关于如何挂钩在启动期间执行较晚的启动代码有什么想法吗?特定于 pyspark 和/或 ipykernel 的解决方案将满足我的需求。

【问题讨论】:

  • 我又玩了一些检查模块的存在......这还不够好。我可以让导入可靠地工作,但预期的功能可能会或可能不会在之后工作。导入时加载的模块列表是相同的。
  • 您检查过PYTHONSTARTUP 环境变量吗?来自python --helpPYTHONSTARTUP:交互式启动时执行的文件(无默认)
  • @piotr-dobrogost:这不是一个交互式启动。我们使用-m ipykernel 调用Python 来启动IPython 内核。

标签: python apache-spark ipython pyspark


【解决方案1】:

嗯,你并没有详细说明你遇到了什么错误。

我认为为 ipython 内核自定义启动行为的规范方法是设置一个配置文件并设置 exec_lines 选项。

例如你可以输入~/.ipython/profile_default/ipython_config.py

# sample ipython_config.py
c = get_config()

c.InteractiveShellApp.exec_lines = [
    'import numpy',
    'import scipy'
]
c.InteractiveShellApp.exec_files = [
    'mycode.py',
    'fancy.ipy'
]

【讨论】:

  • 我没有收到错误消息或日志输出或任何内容。它只是不起作用:-(我会看看 exec_lines,谢谢你的提示。
  • 我看到 ipykernel 也有加载扩展的机制。还不知道这是否能解决我的问题,但它肯定回答了我的问题。
猜你喜欢
  • 1970-01-01
  • 2023-01-26
  • 2011-04-29
  • 2019-01-08
  • 2015-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多