gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 07:09:47 25 4
gpt4 key购买 nike

我有一个执行 mysql 的小 ruby 脚本导入方式: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的buffer已满,该过程将等到它被刷新,但由于这是首先在最底层完成的,所以这永远不会发生。

希望有人能验证我的理论?我如何编写代码来打印出 stdout 中的所有内容?并将所有内容写入 stdin还有吗?

提前致谢!

最佳答案

  • 由于您只写入 stdout,您可以简单地使用 Open3#popen2estdoutstderr 合并到一个流中。
  • 要将以换行符结尾的字符串写入流,您可以像在简单的 hello world 程序中使用 $stdout 一样使用 puts
  • 您必须使用 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

关于Ruby—Open3.popen3/如何打印输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25325624/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com