我正在尝试从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
文件现在需要b
的string
类型,并且相同的调用在终端中工作。似乎在子进程中有一些本地缓存的过时版本的cli.rb
文件被ruby调用,而不是终端。我甚至尝试将此添加到cli.rb
文件,看看它是否注册:
puts "TESTING MODIFICATION"
该字符串在终端运行时打印,而不是在子进程运行时打印(尽管其他较旧的输出会打印)。
我还确保ruby -v
在这两种情况下返回相同的版本,它确实如此。我真的不确定是什么导致了这里的脱节。我还在Ubuntu上通过Pycharm运行Python子进程,如果这有任何相关性的话。什么好主意吗?
修复它感谢engineersmnky的帮助。无论出于何种原因,子进程,无论是否使用shell=True
或shell=False
,是否使用bash,是否使用env=os.environ
,等等,都无法读取ruby环境,包括gem的本地更改。它只能读取礼物发布的更改。我是一个红宝石/宝石新手,所以原因对我来说不是很明显。
我没有我正在编辑的gem的repo的所有权,所以我创建了一个私有的repo分支,将我的本地更改移动到该repo,编辑了*。Gemspec文件以反映更改,并在本地以相同的名称构建和安装一个新的gem。现在一切都正常了。我现在所要做的就是记住将我的本地更改添加到私有git中,并在进行新更改时根据需要重新安装。从技术上讲,也许我可以在不提交任何内容的情况下将本地更改添加到公共repo,但我更愿意在私有repo中谨慎行事。