原帖在 PyCharm 可运行,切到 Jupyter 后,import torch 在包初始化内部失败:
NameError: name '_C' is not defined
_C 是底层扩展名,别按普通变量未定义处理
原题从 Notebook 导入 Session,间接进入 torch 初始化,而 IDE 可以运行。这种入口差异首先值得比较 kernel 的解释器和模块位置;不能把一般 NameError 文章中的“先给变量赋值”应用到 torch._C。
_C 是 torch 的底层扩展相关名字,不应在业务代码里补一个 _C 变量。先判断 Notebook 是否选错环境,或导入了不完整/被遮挡的 torch。
在失败的 Notebook 中执行标准库检查:
import sys
import os
import importlib.util
print("josh050608")
print("python:", sys.executable)
print("cwd:", os.getcwd())
print("torch spec:", importlib.util.find_spec("torch"))
再在能成功的 IDE 里运行同一段,比较解释器与 spec.origin。若 Notebook 用错 kernel,选择项目环境对应的 kernel,并重启后先单独 import torch,不要先运行全部业务模块。
如果路径指向项目目录、torch 源码树或同名文件,先消除遮挡。若路径指向预期 site-packages,保留第一次导入的完整错误,检查底层扩展/动态库加载信息。在该解释器终端执行 python -m pip show torch 和 python -m pip check;仅升级 Jupyter 不会自动修复二进制包。
需要重建安装时,先在独立受支持环境验证官方匹配构建,避免直接破坏可工作的 IDE 环境。原帖没有足够信息证明是某个固定版本 bug。
验证应在全新 kernel 中单独导入 torch、构造 CPU 张量,然后再导入 Session。不要通过修改 torch.init.py 或注释 _C 使用处绕过初始化错误。
将业务导入链缩到单独 import torch
在全新 Notebook kernel 的第一个单元只运行环境检查与 import torch。若这里也失败,暂不导入 algorithms,说明问题已缩到环境或包初始化;若单独成功,再按 Session → Episode 等路径逐段恢复,检查循环导入和同名模块。
同一个解释器从项目目录和空目录各试一次,可以区分当前路径遮挡。以下片段只读取模块 spec,不要求 torch 导入成功:
import sys
import importlib.util
spec = importlib.util.find_spec("torch")
print("kernel executable:", sys.executable)
print("origin:", None if spec is None else spec.origin)
print("package locations:", None if spec is None else spec.submodule_search_locations)
| 对照结果 | 下一步 |
|---|---|
| IDE 与 Notebook 解释器不同 | 选择项目环境对应 kernel,重启后再测试 |
| 导入位置落在项目或源码目录 | 消除命名冲突,退出旧进程后重新导入 |
| 两处同环境同路径,仍失败 | 保存第一次完整导入错误,查二进制依赖与安装记录 |
| torch 单独正常,业务导入失败 | 逐段恢复导入链,检查部分初始化与循环依赖 |
安装修复优先在独立环境验证官方构建,保留原先能运行的 IDE 环境。不要修改 torch 的 init.py 注释 _C,也不要把当前案例直接归因于 Cython 缺失。完成标准是全新 kernel 单独导入、CPU 小运算与原业务导入均通过。
参考:原始求助帖;技术依据:Python 导入机制、pip 官方用法、PyTorch 官方安装指南。