Ruby — Open3.popen3 /如何打印输出

菲利普

我有一个小的ruby脚本,该脚本mysql以以下方式进行导入:mysql -u <user> -p<pass> -h <host> <db> < file.sql,但可以利用它Open3.popen3来做到这一点。到目前为止,这就是我所拥有的:

mysqlimp = "mysql -u #{mysqllocal['user']} "
mysqlimp << "-h #{mysqllocal['host']} "
mysqlimp << "-p#{mysqllocal['pass']} "
mysqlimp << "#{mysqllocal['db']}"

Open3.popen3(mysqlimp) do |stdin, stdout, stderr, wthr|
  stdin.write "DROP DATABASE IF EXISTS #{mysqllocal['db']};\n"
  stdin.write "CREATE DATABASE #{mysqllocal['db']};\n"
  stdin.write "USE #{mysqllocal['db']};\n"

  stdin.write mysqldump #a string containing the database data
  stdin.close

  stdout.each_line { |line| puts line }
  stdout.close

  stderr.each_line { |line| puts line }
  stderr.close
end

那实际上是在做这份工作,但是有一件事困扰着我,与我想看到的输出有关。

如果我将第一行更改为:

mysqlimp = "mysql -v -u #{mysqllocal['user']} " #note the -v

然后整个脚本将永远挂起。

我猜想,发生这种情况是因为读和写流相互阻塞,而且我还猜想stdout需要定期刷新,以便stdin继续使用。换句话说,只要的缓冲区stdout已满,进程就会一直等到刷新为止,但是由于这是从最底部开始进行的,因此永远不会发生。

我希望有人可以验证我的理论吗?我该如何编写能打印出的所有内容stdout并将其全部写入的代码stdin

谢谢你在前面!

帕特里克·奥斯奇(Patrick Oscity)
  • 由于您只写到标准输出,你可以简单地使用Open3#popen2e能够综合stdoutstderr成一个单一的数据流。
  • 要将换行符终止的字符串写入流,可以puts$stdout在简单的hello world程序中一样使用。
  • 您必须使用waith_thread.joinwait_thread.value等到子进程终止。
  • 无论如何,如果您想立即查看结果,则必须启动一个单独的线程来读取流。

例:

require 'open3'

cmd = 'sh'

Open3.popen2e(cmd) do |stdin, stdout_stderr, wait_thread|
  Thread.new do
    stdout_stderr.each {|l| puts l }
  end

  stdin.puts 'ls'
  stdin.close

  wait_thread.value
end

您的代码已修复:

require 'open3'

mysqldump = # ...

mysqlimp = "mysql -u #{mysqllocal['user']} "
mysqlimp << "-h #{mysqllocal['host']} "
mysqlimp << "-p#{mysqllocal['pass']} "
mysqlimp << "#{mysqllocal['db']}"

Open3.popen2e(mysqlimp) do |stdin, stdout_stderr, wait_thread|
  Thread.new do
    stdout_stderr.each {|l| puts l }
  end

  stdin.puts "DROP DATABASE IF EXISTS #{mysqllocal['db']};"
  stdin.puts "CREATE DATABASE #{mysqllocal['db']};"
  stdin.puts "USE #{mysqllocal['db']};"
  stdin.close

  wait_thread.value
end

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在 Ruby 中运行多线程 Open3 调用

来自分类Dev

为什么Ruby的popen3因为“打开太多文件”而崩溃?

来自分类Dev

open3命令的语法

来自分类Dev

在Ruby中杀死一个使用open3的进程

来自分类Dev

perl / embperl-IPC :: Open3

来自分类Dev

如何使用“超过3个参数”将打印输出转换为变量/字符串?(python 3)

来自分类Dev

Ubuntu Python3双重打印输出

来自分类Dev

Python 3从打印输出创建目录名称

来自分类Dev

perl IPC:Open3最少可以通过perlcritic吗?

来自分类Dev

与perlcritic一起使用IPC :: Open3

来自分类Dev

编辑CSV文件Python 3-将文件内容与打印输出匹配

来自分类Dev

Python3:从 .fasta 构建字典 - 价值的“奇怪”打印输出

来自分类Dev

D3.js条形图颜色未显示在打印输出中,但显示在浏览器中

来自分类Dev

我的程序可以正确执行所有操作,只是它会以随机顺序打印输出[Python 3,初学者]

来自分类Dev

Perl IPC :: Open3和bash -s:我可以在bash及其子代之间区分STDIN吗?

来自分类Dev

如何垂直打印输出

来自分类Dev

Ruby Rails-查询很快,直到我打印输出?

来自分类Dev

Ruby Rails-查询很快,直到我打印输出?

来自分类Dev

Python3 UnitTests:如何打印到标准输出

来自分类Dev

ruby popen3-如何在不重新打开过程的情况下重复写入stdin和读取stdout?

来自分类Dev

如何从左至右打印输出?

来自分类Dev

如何并排打印输出?

来自分类Dev

如何为SqlAlChemy打印输出?

来自分类Dev

如何以某种方式打印输出

来自分类Dev

如何遍历SQL并打印输出时间

来自分类Dev

如何让打印输出从右到左开始?

来自分类Dev

如何让Ruby on Rails输出Bootstrap v3脚手架?

来自分类Dev

Awk比较3个值,第一个文件值之间的第二个文件值,两个文件之间的多列打印输出到第三个文件

来自分类Dev

限制打印输出

Related 相关文章

  1. 1

    在 Ruby 中运行多线程 Open3 调用

  2. 2

    为什么Ruby的popen3因为“打开太多文件”而崩溃?

  3. 3

    open3命令的语法

  4. 4

    在Ruby中杀死一个使用open3的进程

  5. 5

    perl / embperl-IPC :: Open3

  6. 6

    如何使用“超过3个参数”将打印输出转换为变量/字符串?(python 3)

  7. 7

    Ubuntu Python3双重打印输出

  8. 8

    Python 3从打印输出创建目录名称

  9. 9

    perl IPC:Open3最少可以通过perlcritic吗?

  10. 10

    与perlcritic一起使用IPC :: Open3

  11. 11

    编辑CSV文件Python 3-将文件内容与打印输出匹配

  12. 12

    Python3:从 .fasta 构建字典 - 价值的“奇怪”打印输出

  13. 13

    D3.js条形图颜色未显示在打印输出中,但显示在浏览器中

  14. 14

    我的程序可以正确执行所有操作,只是它会以随机顺序打印输出[Python 3,初学者]

  15. 15

    Perl IPC :: Open3和bash -s:我可以在bash及其子代之间区分STDIN吗?

  16. 16

    如何垂直打印输出

  17. 17

    Ruby Rails-查询很快,直到我打印输出?

  18. 18

    Ruby Rails-查询很快,直到我打印输出?

  19. 19

    Python3 UnitTests:如何打印到标准输出

  20. 20

    ruby popen3-如何在不重新打开过程的情况下重复写入stdin和读取stdout?

  21. 21

    如何从左至右打印输出?

  22. 22

    如何并排打印输出?

  23. 23

    如何为SqlAlChemy打印输出?

  24. 24

    如何以某种方式打印输出

  25. 25

    如何遍历SQL并打印输出时间

  26. 26

    如何让打印输出从右到左开始?

  27. 27

    如何让Ruby on Rails输出Bootstrap v3脚手架?

  28. 28

    Awk比较3个值,第一个文件值之间的第二个文件值,两个文件之间的多列打印输出到第三个文件

  29. 29

    限制打印输出

热门标签

归档