加载模块后运行Python启动代码

Rol*_*ber 6 python ipython apache-spark pyspark

我正在使用带有SparkContext的Jupyter笔记本和Python内核.一位同事编写了一些Python代码,用于通过ipykernel事件连接Spark事件.当我们从笔记本电脑单元导入他的模块时,它适用于我们需要支持的所有组合: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完全初始化.但在任何笔记本单元执行之前,它仍应作为内核启动的一部分执行.我发现这个技巧可以延迟代码执行直到sys.argv初始化.但我不认为它可以对全局变量起作用sc,因为Python全局变量仍然是模块的本地变量.到目前为止,我能想到的最好的是使用计时器来检查每一秒是否存在某些模块sys.modules.但这不是很可靠,因为我不知道如何区分完全初始化的模块和仍在加载过程中的模块.

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

Gia*_*los 2

嗯,您并没有真正提供有关您遇到的错误的详细信息。

我认为自定义 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'
]
Run Code Online (Sandbox Code Playgroud)