Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从ruby脚本运行另一个ruby脚本_Ruby - Fatal编程技术网

从ruby脚本运行另一个ruby脚本

从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,因为我希望它能够在不同的计

在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,因为我希望它能够在不同的计算机上运行,其中一些计算机没有
/usr/bin/env

Edit:我不是指
load
require
等,而是指产生新进程(因此我可以使用多个CPU)

将执行b.rb的内容(您调用leve off the“.rb”,并且有一个搜索路径)。在您的情况下,您可能会执行以下操作:

a、 rb:

b、 rb:

请注意,如果使用,Ruby将只加载和执行文件一次(每次调用它时都会重新加载),但是可以根据需要多次调用文件中定义的方法

随着事情变得越来越复杂,您将希望转向面向对象的设计

编辑:在这种情况下,您应该研究Ruby线程。一个简单的例子是:

a、 rb:

b、 rb:

去年夏天写了一系列关于启动Ruby子流程的不同方法的文章:

[注:第4部分似乎尚未发布。]


可能有帮助

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")