为什么在Python中从子进程运行Ruby时使用过时版本的Ruby脚本?



我正在尝试从Python接口运行Ruby项目,但在其最新形式中,它仅在从终端运行时有效,而不是从Python中的子进程运行。Ruby项目由一个可执行文件(姑且称其为exeFile)组成,该文件运行命令行接口工具(姑且称其为cli.rb),该工具需要并调用项目中其他各种Ruby文件中的各种结构。CLI文件通过Thor接受命令行参数。此操作在终端上有效,但在修改cli.rb文件时,在子进程调用中失败。

我已经确保我传递了所有正确的参数给subprocess.Popen。例如:

popen = subprocess.Popen(['/home/daveshere/.rbenv/shims/ruby', '/media/daveshere/Data/exeFile', '--b', '1.1.1', '-p'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, stdin=subprocess.PIPE, universal_newlines=True, shell=False)

p参数在cli.rb文件中没有改变,并且在终端和子进程中都有效。但是几天前,我将b的类型从numeric更改为string,这使得程序可以正常运行。同样,这在终端中起作用,但在从子进程运行时不起作用。相反,打印Subprocess输出会显示错误:

Expected numeric value for '--b'; got "1.1.1"

尽管cli.rb文件现在需要bstring类型,并且相同的调用在终端中工作。似乎在子进程中有一些本地缓存的过时版本的cli.rb文件被ruby调用,而不是终端。我甚至尝试将此添加到cli.rb文件,看看它是否注册:

puts "TESTING MODIFICATION"

该字符串在终端运行时打印,而不是在子进程运行时打印(尽管其他较旧的输出会打印)。

我还确保ruby -v在这两种情况下返回相同的版本,它确实如此。我真的不确定是什么导致了这里的脱节。我还在Ubuntu上通过Pycharm运行Python子进程,如果这有任何相关性的话。什么好主意吗?

修复它感谢engineersmnky的帮助。无论出于何种原因,子进程,无论是否使用shell=Trueshell=False,是否使用bash,是否使用env=os.environ,等等,都无法读取ruby环境,包括gem的本地更改。它只能读取礼物发布的更改。我是一个红宝石/宝石新手,所以原因对我来说不是很明显。

我没有我正在编辑的gem的repo的所有权,所以我创建了一个私有的repo分支,将我的本地更改移动到该repo,编辑了*。Gemspec文件以反映更改,并在本地以相同的名称构建和安装一个新的gem。现在一切都正常了。我现在所要做的就是记住将我的本地更改添加到私有git中,并在进行新更改时根据需要重新安装。从技术上讲,也许我可以在不提交任何内容的情况下将本地更改添加到公共repo,但我更愿意在私有repo中谨慎行事。

最新更新