Windows 10下VS Code打开文件夹后PySpark运行报错的问题咨询
VS Code「打开文件夹」操作的实际作用
打破对该操作的认知误区,它并非单纯的常用文件快速访问入口,核心作用是为VS Code建立项目级的运行上下文锚点:
- 锚定工作区根目录:后续所有文件相对路径解析、扩展运行时的当前工作目录(CWD)、子进程的启动权限校验,都会默认绑定这个根目录路径。
- 加载项目级配置:VS Code会自动识别根目录下的
.vscode配置、项目文件结构,匹配对应的运行规则,不需要全局配置就能适配单个项目的运行需求。 - 影响所有衍生进程:只要锚定了该根目录,Python扩展启动的脚本、PySpark派生的Python worker等所有子进程,都会默认继承这个路径作为启动工作目录。
打开UNC网络路径文件夹触发「Python worker failed to connect back」的原因
结合观测到的所有运行现象、当前环境配置,故障是多因素叠加触发的,核心逻辑链如下:
- 你打开的目标文件夹是带空格的UNC网络路径(形式为
\\blablabla\bla\my folder),当VS Code将其设为工作区根目录后,Python扩展启动脚本时会自动把工作目录切换到该网络路径下,替换掉之前本地Anaconda的启动路径。 - 你当前配置的环境变量
PYSPARK_PYTHON=python是相对路径,PySpark派生Python worker子进程时,会在当前工作目录下寻找对应的python可执行文件;UNC网络路径下不存在这个可执行文件,本身就会导致worker启动失败。 - 平台固有缺陷叠加:Windows对带空格的UNC路径有解析bug,同时安全机制会拦截跨网络路径启动的子进程与本地回环端口的通信,就算worker启动成功,也没法和Java端的Driver建立双向连接,最终抛出连接失败的报错。
对应观测到的现象完全匹配该逻辑:
- 读取本地C盘CSV的代码不报错:因为加载文件的路径是写死的绝对本地路径,不依赖工作目录权限,文件可正常读取就不会触发路径解析异常。
- .ipynb文件内运行所有代码不报错:因为VS Code的Jupyter扩展启动内核时,默认将工作目录锚定在Anaconda的本地安装路径下,不会跟随工作区的UNC路径切换,绕开了网络路径的权限拦截。
- 关闭打开的文件夹后代码恢复正常:此时工作目录回到本地Anaconda路径,相对路径
python可被正确解析,worker进程能正常启动并建立连接。 - 报错的stage编号、失败次数不固定:端口连接失败存在随机性,当网络路径响应速度快时可能偶发跑通,响应慢时就会触发连接超时报错。
保持打开该UNC文件夹前提下的报错规避方案
不需要关闭工作区、不需要大幅调整现有环境变量,按以下步骤配置即可:
- 第一步:强制修正Python终端的启动路径
打开VS Code设置(快捷键Ctrl+,),找到Python > Terminal: Execute In File Dir选项,取消勾选。确保Python终端永远从本地Anaconda安装路径(C:\users\me\Anaconda3)启动,不会随工作区UNC路径切换工作目录。 - 第二步:在SparkSession初始化时显式指定Worker的运行路径
创建Spark会话时,用链式配置明确指定Python解释器的绝对路径、Worker的环境变量,绕开工作目录继承带来的相对路径解析问题,示例代码:from pyspark.sql import SparkSession spark = SparkSession.builder.master("local[1]")\ .appName("local")\ .config("spark.pyspark.python", "C:\\users\\me\\Anaconda3\\python.exe")\ .config("spark.executorEnv.PYTHONPATH", "C:\\Spark\\spark-3.1.1-bin-hadoop2.7\\python")\ .getOrCreate() - 第三步:(可选)将UNC网络路径映射为本地盘符
打开Windows命令提示符,执行映射命令将网络路径转为本地盘符,从根源上绕开Windows对UNC路径的进程拦截,示例命令:
映射完成后,在VS Code中打开Z盘对应的文件夹作为工作区,所有路径解析都会按照本地盘符逻辑执行,不会触发网络路径的权限拦截。net use Z: \\blablabla\bla\my folder
内容的提问来源于stack exchange,提问作者BeeePollen
相关产品推荐
相关产品推荐

