如何在PySpark Jupyter内核中获取当前脚本所在目录?
在PySpark内核的Jupyter Notebook中获取当前脚本目录的解决方法
方法1:提取JPY_SESSION_NAME并解析目录
你提到的JPY_SESSION_NAME变量确实可以用来定位notebook路径,但直接用%env魔法命令无法直接赋值给Python变量,需要通过IPython的API来获取:
from IPython import get_ipython import os # 获取JPY_SESSION_NAME的值 jpy_session = get_ipython().run_line_magic('env', 'JPY_SESSION_NAME') # 提取notebook所在目录 current_dir = os.path.dirname(jpy_session)
JPY_SESSION_NAME返回的是notebook的相对路径(比如notebooks/my_script.ipynb),用os.path.dirname就能得到它的父目录。
方法2:通过Jupyter API获取完整路径
如果需要更准确的完整本地路径,可以结合jupyter notebook list命令来获取所有运行中的notebook信息,再匹配当前会话:
import os import subprocess import json from IPython import get_ipython # 获取当前会话的notebook名称 jpy_session = get_ipython().run_line_magic('env', 'JPY_SESSION_NAME') notebook_filename = os.path.basename(jpy_session) # 调用Jupyter命令获取所有运行的notebook数据 notebooks_data = subprocess.check_output( ['jupyter', 'notebook', 'list', '--json'] ).decode('utf-8') notebooks = json.loads(notebooks_data)['notebooks'] # 匹配当前notebook并提取目录 current_notebook = next(nb for nb in notebooks if nb['name'] == notebook_filename) current_full_dir = os.path.dirname(current_notebook['path'])
这个方法能拿到notebook的完整本地路径,适合需要绝对路径的场景。
注意事项
- 上述方法仅适用于本地模式或客户端模式的PySpark内核,如果是集群模式(比如YARN集群),driver所在的本地目录和executor的工作目录并不一致,此时获取的目录仅代表driver端的notebook位置。
- 如果你的notebook是通过JupyterLab打开的,
JPY_SESSION_NAME的格式可能略有不同,但解析逻辑一致。
内容的提问来源于stack exchange,提问作者Pablo CA
相关产品推荐
相关产品推荐

