我有一个小的可执行文件,我们将其称为“ decode”(用C编写),该文件在stdin(图像文件)上获取一个数据块,将其转换并将其吐回到stdout。因此,从linux命令行中,以下命令可以正常工作:
cat image_file.format1 | ./irb/decode > image_file.format2
我正在尝试将此二进制文件包装在一些ruby代码中,并消除使用Open3.popen3使用常规文件IO的需要。这是Ruby代码的相关部分:
.
.
.
Open3.popen3("decode") do |stdin, stdout, stderr, wait_thr|
stdin.write(f)
stdin.close_write
@image_data = stdout.read
@status_message = stderr.read
exit_status = wait_thr.value
end
.
.
.
变量 f 包含要转换的数据块。我正在将其写入文件,然后在写入的文件上调用 decode 。当尝试使用jruby从irb运行上面的代码时,将获得以下错误回溯(已被稍微清理):
Traceback (most recent call last):
16: from org/jruby/RubyKernel.java:1180:in `catch'
15: from org/jruby/RubyKernel.java:1418:in `loop'
14: from org/jruby/RubyKernel.java:1037:in `eval'
13: from t:5:in `<eval>'
12: from /home/user/dev/kf_decoder/lib/kf_decoder/kob.rb:46:in `process'
11: from org/jruby/RubyKernel.java:311:in `open'
10: from org/jruby/RubyIO.java:1179:in `open'
9: from /home/user/dev/kf_decoder/lib/kf_decoder/kob.rb:63:in `block in process'
8: from org/jruby/ext/stringio/StringIO.java:423:in `each_byte'
7: from /home/user/dev/kf_decoder/lib/kf_decoder/kob.rb:87:in `block in process'
6: from /home/user/dev/kf_decoder/lib/kf_decoder/kob.rb:205:in `decodeTiff'
5: from /home/user/dev/kf_decoder/lib/kf_decoder/tiff.rb:123:in `initialize'
4: from /home/user/.rbenv/versions/jruby-9.2.0.0/lib/ruby/stdlib/open3.rb:102:in `popen3'
3: from /home/user/.rbenv/versions/jruby-9.2.0.0/lib/ruby/stdlib/open3.rb:206:in `popen_run'
2: from org/jruby/RubyKernel.java:1642:in `spawn'
1: from org/jruby/RubyProcess.java:1570:in `spawn'
Errno::EBADF (Bad file descriptor - irb/decode
有趣的是,如果我使用的是系统ruby解释器或rubinius(我已经安装了这两者,并且可以使用rbenv进行切换),则完全相同的代码在irb中可以正常工作。
谁能告诉我是什么?我正在运行ubuntu linux 18.04 LTS和jruby 9.2.0.0(2.5.0)。出于速度和其他方面的考虑,Jruby是首选的平台,因此我需要使其正常工作。
答案 0 :(得分:0)
问题与jruby使用的Java版本有关。截至本文发布时,java 9和10不能按我需要的方式与jruby和popen3一起使用。 Java 8可以。有关完整的详细信息,请参见Github上的以下线程: