PyCharm科学模式代码单元环境变量设置及运行报错解决
解决PyCharm代码单元中Numba缓存环境变量不生效问题
问题现象
在PyCharm科学模式下,以下代码运行整个脚本时正常执行:
#%% <- Scientific Mode: on import os from pathlib import Path CACHE_DIR = Path("/home/me/numba_cache") CACHE_DIR.touch(exist_ok=True) os.environ["NUMBA_CACHE_DIR"] = str(CACHE_DIR) from numba import jit @jit(nopython=True, cache=True) def square(x): return x ** 2 print(square(5))
但单独运行该代码单元时,会出现如下错误:
Traceback (most recent call last): File "/home/me/.pycharm_helpers/pydev/pydevconsole.py", line 364, in runcode coro = func() ^^^^^^ File "<input>", line 11, in <module> File "/home/me/.pyenv/versions/3.11.1/envs/my_env/lib/python3.11/site-packages/numba/core/decorators.py", line 234, in wrapper disp.enable_caching() File "/home/me/.pyenv/versions/3.11.1/envs/my_env/lib/python3.11/site-packages/numba/core/dispatcher.py", line 863, in enable_caching self._cache = FunctionCache(self.py_func) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/me/.pyenv/versions/3.11.1/envs/my_env/lib/python3.11/site-packages/numba/core/caching.py", line 601, in __init__ self._impl = self._impl_class(py_func) ^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/me/.pyenv/versions/3.11.1/envs/my_env/lib/python3.11/site-packages/numba/core/caching.py", line 337, in __init__ raise RuntimeError("cannot cache function %r: no locator available " RuntimeError: cannot cache function 'square': no locator available for file '<input>'
已尝试在运行配置中设置环境变量,但仅对整脚本运行有效,代码单元单独运行时无效。
原因分析
单独运行代码单元时,代码是在PyCharm的交互式控制台(标记为<input>)中执行的,Numba的缓存机制需要依赖真实的文件路径来定位和存储缓存文件,而交互式环境没有有效的文件定位器,因此触发报错——这和代码内设置环境变量的操作无关,是代码单元运行的上下文导致的。
解决方法
1. 临时禁用代码单元的缓存
如果只是为了测试代码单元功能,可临时将@jit装饰器的cache参数设为False,绕过缓存机制:
@jit(nopython=True, cache=False) def square(x): return x ** 2
2. 在PyCharm全局控制台环境中设置变量
若需要在代码单元中保留缓存功能,可直接在PyCharm的Python控制台全局环境变量中配置NUMBA_CACHE_DIR:
- 打开PyCharm设置(
File > Settings) - 导航到
Build, Execution, Deployment > Console > Python Console - 在Environment variables区域添加:
NUMBA_CACHE_DIR=/home/me/numba_cache - 重启PyCharm后,单独运行代码单元时缓存即可正常生效
3. 将代码单元保存为独立脚本运行
如果不想修改代码或全局设置,可将当前代码单元的内容复制到一个新的.py文件中,单独运行该文件——此时Numba能识别到真实的文件路径,缓存功能正常工作。
内容的提问来源于stack exchange,提问作者GlaceCelery
相关产品推荐
相关产品推荐

