使用reticulate执行source_python调用Python脚本时出现FileNotFoundError的原因咨询(文件路径已确认存在)
明明文件/目录确实存在,却报找不到的错误,这种情况我也遇到过,大概率是路径解析或者环境工作目录的问题,给你梳理几个常见的排查方向:
R当前工作目录和你预期的不一致
你用了相对路径R/pypYIN/src/pYINmain.py,但R的工作目录可能不在包含R文件夹的上级目录下。先跑一下getwd()看看当前工作目录是什么,如果不对,用setwd("/path/to/your/parent/dir")切换到正确的目录,或者直接把相对路径改成基于当前工作目录的格式。Python脚本内部的路径引用出错
错误提示里找不到的是/Users/blah/blah/R/pyPYIN/src这个目录,而不是pYINmain.py文件本身,说明reticulate已经成功找到并加载了Python脚本,但脚本内部有代码在尝试访问src目录(比如读取里面的其他文件),但用的是相对路径,而Python的工作目录和脚本所在目录不一致。解决办法是在Python脚本开头加上:import os # 获取脚本本身所在的目录 script_dir = os.path.dirname(os.path.abspath(__file__)) # 切换到脚本所在目录 os.chdir(script_dir)这样后续脚本里的相对路径就会基于脚本所在的位置,不会再出错。
reticulate使用的Python环境工作目录异常
有时候reticulate调用的Python环境和系统默认的不是同一个,它的工作目录可能和R的工作目录不匹配。你可以在Python脚本开头加一行print(os.getcwd()),运行后看看输出的路径是不是你期望的。如果不是,除了上面的切换目录方法,也可以在R里用reticulate::use_python("/path/to/your/python")指定要使用的Python解释器,确保环境一致。路径大小写或拼写细节错误
虽然你说路径存在,但在macOS/Linux系统上文件名是区分大小写的,比如pyPYIN和pypyin是完全不同的目录,仔细检查代码里写的路径和实际的文件夹/文件名是不是完全一致,包括大小写、拼写,有没有多打或少打字符。文件/目录权限问题
即使文件存在,R进程可能没有读取目录或文件的权限。打开终端,运行ls -l /Users/blah/blah/R/pyPYIN/src/pYINmain.py(替换成你的绝对路径),看看权限列是不是有r权限(比如-rw-r--r--)。如果权限不足,用chmod +r /Users/blah/blah/R/pyPYIN/src/pYINmain.py给文件添加读取权限,目录的话用chmod +x /Users/blah/blah/R/pyPYIN/src添加执行权限(因为访问目录需要执行权限)。重启会话重置reticulate环境
有时候reticulate的缓存或环境状态会导致奇怪的问题,最简单的办法是重启整个R会话,然后重新加载reticulate,再运行你的代码,说不定就能解决。
内容的提问来源于stack exchange,提问作者eartoolbox

