假设一个人不能使用print(从而享受自动编码检测的好处).所以这让我们失望了sys.stdout.但是,如果不做任何明智的编码sys.stdout是如此愚蠢.
现在,您可以阅读Python维基页面PrintFails并尝试以下代码:
$ python -c 'import sys, codecs, locale; print str(sys.stdout.encoding); \
sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout);
Run Code Online (Sandbox Code Playgroud)
然而,这也不起作用(至少在Mac上).太明白为什么:
>>> import locale
>>> locale.getpreferredencoding()
'mac-roman'
>>> sys.stdout.encoding
'UTF-8'
Run Code Online (Sandbox Code Playgroud)
(UTF-8是终端理解的).
所以将上面的代码更改为:
$ python -c 'import sys, codecs, locale; print str(sys.stdout.encoding); \
sys.stdout = codecs.getwriter(sys.stdout.encoding)(sys.stdout);
Run Code Online (Sandbox Code Playgroud)
现在,unicode字符串被正确发送到sys.stdout终端上并在终端上正确打印(sys.stdout连接到终端).
这是编写unicode字符串的正确方法sys.stdout还是我应该做的其他事情?
编辑:有时 - 比如说,当输出到less- 时sys.stdout.encoding将是None.在这种情况下,上面的代码将失败.
我需要在bash脚本中捕获命令的输出和错误,并知道命令是否成功.
目前,我正在捕捉这两个:
output=$(mycommand 2>&1)
Run Code Online (Sandbox Code Playgroud)
然后我需要检查mycommand的退出值.如果失败了,我需要对输出做一些事情,如果命令成功,我不需要触摸输出.
由于我正在捕获输出,检查$?因为bash成功地将输出捕获到变量中,所以总是为0.
这是一个非常时间敏感的脚本,所以我们试图避免任何较慢的解决方案,如输出到文件并重新读取它.
如果我可以将stdout捕获到一个变量并将stderr捕获到另一个变量,这将解决我的问题,因为我可以检查错误变量是否为空.
谢谢.
有没有办法在Visual Studio中捕获stdout和stderr?例如,当我使用时
cout <<"Hello world!"<< endl;
Run Code Online (Sandbox Code Playgroud)
出现黑色窗口并消失.它太快了,我看不到它.IDE中有一个输出部分,但它只允许我从构建中选择显示输出,而不选择stdout.
作弊解决方案可能会打电话
system("pause");
Run Code Online (Sandbox Code Playgroud)
但听起来不对.我在选项中搜索但我找不到一个项目.
任何人有任何想法?谢谢.我刚开始使用VS而且我之前在Linux上.
在编写bash脚本时,我一直在努力解决这个问题.基本上,我想测量远程服务器上程序的时间,所以我使用命令:
/usr/bin/time -f %e sh -c "my command > /dev/null 2>&1"执行程序.但是,似乎我无法将命令(SSH)的输出捕获到变量.实际上,结果(时间)一直打印到stdout.
完整的代码是:
respond=$(ssh ${fromNode} /usr/bin/time "-f" "%e" "'sh' '-c' 'virsh migrate --live ${VM} qemu+ssh://${toNode}/system --verbose > /dev/null 2>&1'")
Run Code Online (Sandbox Code Playgroud)
响应的值只是空的,尽管时间打印到标准输出.
我对C#/编程非常陌生,并且作为一个学习练习完成了将文本更改为小写的在线挑战.挑战指出它必须'打印到stdout'但我通过使用完成了挑战Console.Writeline
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Lowercase
{
class Program
{
static void Main(string[] args)
{
using ( StreamReader reader = new StreamReader("TextFile1.txt"))
{
while (!reader.EndOfStream)
{
string line = reader.ReadLine();
Console.WriteLine(line.ToLower());
}
Console.ReadLine();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
是否stdout只是另一个名字输出到控制台(提交可以在许多不同的语言),或者做了在线提交代码只是没有正确地检查输出.我用谷歌搜索了'stdout c#',但没有完全理解结果.
我正在使用paramiko在远程机器上通过ssh执行长时间运行的python脚本.工作就像一个魅力,到目前为止没有问题.
不幸的是,stdout(分别是stderr)只在脚本完成后显示!但是,由于执行时间的原因,我更倾向于在打印时输出每个新行,而不是之后.
remote = paramiko.SSHClient()
remote.set_missing_host_key_policy(paramiko.AutoAddPolicy())
remote.connect("host", username="uname", password="pwd")
# myScript produces continuous output, that I want to capture as it appears
stdin, stdout, stderr = remote.exec_command("python myScript.py")
stdin.close()
for line in stdout.read().splitlines():
print(line)
Run Code Online (Sandbox Code Playgroud)
怎么能实现这一目标? 注意:当然可以通过另一个ssh会话将输出传输到文件并"减少"此文件,但这非常难看,我需要一个更清洁,理想的pythonic解决方案:)
以下代码不能在 C++20 中编译
#include <iostream>
#include <cstddef>
int main(){
std::byte b {65};
std::cout<<"byte: "<<b<<'\n';// Missing overload
}
Run Code Online (Sandbox Code Playgroud)
std::byteC++17什么时候加入的,为什么没有对应的operator<<重载打印呢?我也许可以理解不打印容器的选择,但为什么不std::byte呢?它试图充当原始类型,我们甚至有 的重载std::string,最近的std::string_view,也许是最相关的 std::complex,并且std::bitset它本身可以被打印。
还有std::hex类似的修饰符,所以默认打印 0-255 应该不是问题。
这只是疏忽吗?怎么样operator>>,std::bitset有它,它根本不是微不足道的。
编辑:发现甚至std::bitset可以打印。
之前,我可以从Console.app中的应用程序读取所有stdout/stderr数据.一段时间以来,情况已经不是这样了(尽管NSLog数据仍然存在).我现在在10.8.
在SU上,还有一个类似的问题尚未得到解答.
有没有被改变,即stdout不应该再被记录?或者在我的系统中出现了什么问题(从旧的SU问题来看,听起来可能就是这样 - 尽管没有帮助)?
我可以以某种方式改变它吗?
我将我的c程序的stderr和stdout的输出重定向到两个文件,然后恢复原始的stdout和stderr:
int sout = dup(fileno(stdout));
freopen("test.txt","w",stdout);
int serr = dup(fileno(stderr));
freopen("test.txt","a",stderr);
//some output....
dup2(sout,fileno(stdout));
close(sout);
dup2(serr,fileno(stderr));
close(serr);
Run Code Online (Sandbox Code Playgroud)
这就是代码示例.这有效.
但是我想将stdout和stderr重定向到同一个文件(以后再恢复它),以便输出按照与不重定向stderr和stdout时在控制台输出上排序的顺序相同的顺序排序.我怎样才能做到这一点?
我创造了:
var access = fs.createWriteStream('/var/log/node/api.access.log', { flags: 'w' });
Run Code Online (Sandbox Code Playgroud)
然后管道:
process.stdout.pipe(access);
Run Code Online (Sandbox Code Playgroud)
然后尝试:
console.log("test");
Run Code Online (Sandbox Code Playgroud)
并且/var/log/node/api.access.log中没有出现任何内容.但是这种方式有效:
process.stdout.pipe(access).write('test');
Run Code Online (Sandbox Code Playgroud)
有人可以解释我做错了什么吗?