如何使从Ruby C扩展中调用的printf静音? 我正在运行一个RubyGem,它依赖于C扩展(不是对系统的调用) C代码多次调用printf 我想使这些调用的输出静音 更改Ruby的STDOUT()或STDERR不会阻止文本输出
是否可以在不修改C代码的情况下执行此操作?如果是,如何操作?如果您可以访问C源代码:如何使从Ruby C扩展中调用的printf静音? 我正在运行一个RubyGem,它依赖于C扩展(不是对系统的调用) C代码多次调用printf 我想使这些调用的输出静音 更改Ruby的STDOUT()或STDERR不会阻止文本输出,c,ruby,printf,stdout,C,Ruby,Printf,Stdout,是否可以在不修改C代码的情况下执行此操作?如果是,如何操作?如果您可以访问C源代码: #define printf(...) 此宏窗体是C99可变宏。如果您可以访问C源代码: #define printf(...) 此宏窗体是C99可变宏。可能Ruby正在打印到stderr而不是stdout,这就是为什么更改Ruby的stdout并不能解决问题的原因。 (通常,stderr和stdout都会转到控制台。) 尝试重定向stderr。我记得它是:myprogram 2>/dev/null可能R
#define printf(...)
此宏窗体是C99可变宏。如果您可以访问C源代码:
#define printf(...)
此宏窗体是C99可变宏。可能Ruby正在打印到
stderr
而不是stdout
,这就是为什么更改Ruby的stdout
并不能解决问题的原因。(通常,
stderr
和stdout
都会转到控制台。)
尝试重定向
stderr
。我记得它是:myprogram 2>/dev/null
可能Ruby正在打印到stderr
,而不是stdout
,这就是为什么更改Ruby的stdout
并不能解决问题的原因。(通常,
stderr
和stdout
都会转到控制台。)
尝试重定向
stderr
。我记得应该是:myprogram2>/dev/null
最初有人在我的帖子上建议使用。这对我有用。不幸的是,此人删除了自己的评论,因此我将发布我最后使用的更详细的功能:
def silence_stdout(log = '/dev/null')
old = $stdout.dup
$stdout.reopen(File.new(log, 'w'))
yield
$stdout = old
end
用法:
silence_stdout { foo } # Won't be displayed, won't be logged.
silence_stdout('log.txt') { bar } # Won't be displayed, logged in log.txt.
最初有人评论我的帖子,建议使用。这对我有用。不幸的是,此人删除了自己的评论,因此我将发布我最后使用的更详细的功能:
def silence_stdout(log = '/dev/null')
old = $stdout.dup
$stdout.reopen(File.new(log, 'w'))
yield
$stdout = old
end
用法:
silence_stdout { foo } # Won't be displayed, won't be logged.
silence_stdout('log.txt') { bar } # Won't be displayed, logged in log.txt.
我记得以前找不到这样做的方法。在运行程序时,哪个命令后缀为“2>/dev/null”和“>/dev/null”可以使有问题的
printf
s静音?另外,它是哪个扩展?如果在运行ruby
时重定向stdout
和stderr
是不够的,那么gem中一定有什么特别的事情。我们得看看消息来源才能知道。似乎他们不太可能直接打开/dev/tty
来绕过stdout/stderr
,但如果他们没有从ruby继承stdio,我只能想到这一点。@WayneConrad,运行ruby script.rb>/dev/null会使输出静音,而>2/dev/null则不会。@BenJackson,所讨论的宝石是lda ruby,v。0.3.8. 有问题的行位于ext/lda alpha.c的第64行,它的内容是printf(“alpha最大化:%5.5f%5.5f\n”,f,df)代码>。将“tty”和“dev”的源代码进行灰色化不会产生任何结果。我记得过去没有找到这样做的方法。在运行程序时,哪个命令后缀为“2>/dev/null”和“>/dev/null”会使有问题的printf
s静音?另外,它是哪个扩展?如果在运行ruby
时重定向stdout
和stderr
是不够的,那么gem中一定有什么特别的事情。我们得看看消息来源才能知道。似乎他们不太可能直接打开/dev/tty
来绕过stdout/stderr
,但如果他们没有从ruby继承stdio,我只能想到这一点。@WayneConrad,运行ruby script.rb>/dev/null会使输出静音,而>2/dev/null则不会。@BenJackson,所讨论的宝石是lda ruby,v。0.3.8. 有问题的行位于ext/lda alpha.c的第64行,它的内容是printf(“alpha最大化:%5.5f%5.5f\n”,f,df)代码>。将“tty”和“dev”的源代码进行灰色化不会产生任何结果。我没有想到这一点,但不幸的是这也失败了。我没有想到这一点,但不幸的是这也失败了。请注意,在Windows上/dev/null应该改为NUL。是否可以保存为字符串,不是文件?请注意,Windows上的/dev/null应更改为NUL。是否可以保存为字符串而不是文件?