从ruby脚本运行另一个ruby脚本
在ruby中,是否可以指定使用与原始脚本运行相同的ruby解释器调用另一个ruby脚本 例如,如果a.rb运行b.rb两次,是否可以替换从ruby脚本运行另一个ruby脚本,ruby,Ruby,在ruby中,是否可以指定使用与原始脚本运行相同的ruby解释器调用另一个ruby脚本 例如,如果a.rb运行b.rb两次,是否可以替换 system("ruby", "b.rb", "foo", "bar") 有点像 run_ruby("b.rb", "foo", "bar") 因此,如果您在原件上使用了ruby1.9.1 a.rb,ruby1.9.1将用于b.rb,但如果您在原件上使用ruby a.rb,将在b.rb上使用ruby 我不希望使用shebangs,因为我希望它能够在不同的计
system("ruby", "b.rb", "foo", "bar")
有点像
run_ruby("b.rb", "foo", "bar")
因此,如果您在原件上使用了ruby1.9.1 a.rb
,ruby1.9.1
将用于b.rb,但如果您在原件上使用ruby a.rb
,将在b.rb上使用ruby
我不希望使用shebangs,因为我希望它能够在不同的计算机上运行,其中一些计算机没有/usr/bin/env
Edit:我不是指load
或require
等,而是指产生新进程(因此我可以使用多个CPU)
将执行b.rb的内容(您调用leve off the“.rb”,并且有一个搜索路径)。在您的情况下,您可能会执行以下操作:
a、 rb:
b、 rb:
请注意,如果使用,Ruby将只加载和执行文件一次(每次调用它时都会重新加载),但是可以根据需要多次调用文件中定义的方法
随着事情变得越来越复杂,您将希望转向面向对象的设计
编辑:在这种情况下,您应该研究Ruby线程。一个简单的例子是:
a、 rb:
b、 rb:
去年夏天写了一系列关于启动Ruby子流程的不同方法的文章:
可能有帮助require技巧是一个好主意,假设所讨论的脚本没有阻塞尝试重新定义您可能已设置的任何常量,或者调用您可能已修补运行时monkey的对象上的方法以不再遵守其标准约定 在这两种情况下,问题不在于方法,而在于脚本本身的代码。表现出良好的礼貌,把你的常量放在一个名称空间中,不要在运行时进行破坏性的修补 为了确保所讨论的脚本不会干扰调用脚本的运行时,并防止它可能在某处调用Kernel/Process.exit(),请尝试以下操作
pid=Process.fork do
require 'script.rb'
Process.exit
end
ignored, status = Process.waitpid2(pid, Process::WNOHANG)
puts "script.rb PID #{pid} exited, exit status: #{status.exitstatus}"
对于更高级的事情,如写入其stdin流或读取其stdout或stderr流,请使用Open4 gem。JRuby著名的Charles Nutter是一种
内核#ruby
方法,可以使用当前使用的相同ruby实现调用ruby脚本
编辑:提案被拒绝。Matz说MVM(多个虚拟机)可以提供解决方案。这就是我所使用的
/myapp/script/main_script.rb
仅在需要时加载rails环境
ENV['RAILS_ENV'] = ARGV.first || ENV['RAILS_ENV'] || 'development'
require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
从main_script.rb中运行其他从属脚本
require File.expand_path(File.dirname(__FILE__) + "/../script/populate_wh_grape_varieties_table.rb")
如果只想在现有进程的上下文中运行脚本,也可以这样做
eval File.read("/path/to/your/script.rb")
不确定您的用例是什么,但这可能很有用,例如,如果您打开了Rails控制台,并且希望在临时文件中执行一些代码,但不想一直将整个代码块复制到控制台中。这不是我的意思。你明白我所做的编辑是为了什么吗?除了JRuby,这不允许你真正使用多个处理器。如果像Avdi的文章这样彻底的东西不得不使用
File.join(Config::Config['bindir',Config::Config['ruby\u install\u name'])
,这是一个好迹象,没有更好的选择了!这不是一个答案这不会帮助我,但它可能会帮助使用Rails的人。
def b(first, second)
10.times {
puts first + ", " + second;
sleep(0.1);
}
end
pid=Process.fork do
require 'script.rb'
Process.exit
end
ignored, status = Process.waitpid2(pid, Process::WNOHANG)
puts "script.rb PID #{pid} exited, exit status: #{status.exitstatus}"
ENV['RAILS_ENV'] = ARGV.first || ENV['RAILS_ENV'] || 'development'
require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
require File.expand_path(File.dirname(__FILE__) + "/../script/populate_wh_grape_varieties_table.rb")
eval File.read("/path/to/your/script.rb")