从Python子进程运行Ruby时为何调用过时版本的Ruby脚本?
核心现象
终端运行修改后的Ruby项目(cli.rb已将--b参数类型从numeric改为string)完全正常,但Python子进程调用时出现旧版本错误:
Expected numeric value for '--b'; got "1.1.1"
且cli.rb中新增的puts "TESTING MODIFICATION"语句在子进程输出中完全不出现,说明子进程加载的是旧版本的cli.rb。
可能的原因及排查方案
工作目录不匹配
PyCharm运行Python脚本的默认工作目录可能和你终端操作的项目根目录不一致。如果exeFile中用相对路径调用cli.rb,子进程会在Python的工作目录下寻找旧的cli.rb(或错误路径下的旧文件)。
排查:在Python代码中加入import os; print(os.getcwd()),对比终端的pwd输出。解决:在subprocess.Popen中添加cwd="/media/daveshere/Data/你的项目根目录"参数,强制子进程在项目目录下运行。rbenv环境变量未完全加载
虽然ruby -v版本一致,但rbenv的完整环境变量(如GEM_HOME、BUNDLE_PATH、PATH优先级)在PyCharm的子进程中可能未正确加载,导致加载了缓存的旧Gem或代码版本。
排查:在终端和Python子进程中分别打印环境变量(终端用env | grep RBENV,Python用import os; print(os.environ.get('RBENV_ROOT'), os.environ.get('GEM_PATH'))),对比差异。解决:在PyCharm的运行配置中手动添加rbenv相关环境变量,或者在调用subprocess前通过os.environ注入。Ruby字节码缓存未清理
Ruby会生成.rbc字节码缓存文件,修改.rb文件后如果未删除对应的.rbc,Ruby可能优先加载缓存文件。终端可能因触发条件自动更新缓存,但子进程环境未触发。
排查:在项目目录下查找.rbc文件(find . -name "*.rbc"),看是否存在cli.rb对应的旧缓存。解决:删除所有.rbc文件,或在调用Ruby时添加--disable-gems(注意会影响依赖),或设置环境变量RUBYOPT="-W0 -C"强制重新编译。exeFile路径或内容异常
确认Python子进程调用的/media/daveshere/Data/exeFile和终端运行的是同一个文件。检查exeFile内部是否硬编码了cli.rb的旧路径,或者是否是指向旧版本的符号链接。
排查:终端运行cat /media/daveshere/Data/exeFile查看内容,对比项目内的原始exeFile。解决:如果路径错误,修正subprocess中的exeFile路径;如果exeFile本身是旧版本,替换为项目内的最新版本。PyCharm文件同步问题
虽然概率较低,但PyCharm可能存在文件缓存未同步到磁盘的情况。比如你修改了cli.rb,但PyCharm没自动保存,导致磁盘上的文件还是旧版本(若终端能看到修改,此可能性极低)。
排查:手动在PyCharm中按Ctrl+S保存所有文件,或右键项目目录选择"Reload from Disk"。
内容的提问来源于stack exchange,提问作者DavesHere

