【问题标题】:">" not working to direct output of python command to file [duplicate]">" 无法将 python 命令的输出定向到文件 [重复]
【发布时间】:2018-07-23 22:57:55
【问题描述】:

我决定尝试snakefood 来帮助进行重构以检查导入。它一直在屏幕上转储输出,“>”不会将其发送到文件,它只是创建一个空文件。

不幸的是,我不得不使用 Python 2.7 创建一个 virtualenv,因为它可能在 Python 3 中无法正常工作。尽管如此,它可能可以检查 Python 2 项目,即使它是用 Python 2 编写的。我使用的是 Mac,但是它似乎在命令行上使用了与 Linux 类似的命令。

我做到了

pip install six
pip install graphviz
pip install snakefood

一旦 Python 2 环境被激活。

如果我输入

$ sfood-checker path/to/folder

..它会在屏幕上转储大量文本,但是

$ sfood-checker path/to/folder > check.txt

..只创建一个空文件。知道什么是错的,如何解决?想在 sublime 中仔细浏览文件。

【问题讨论】:

  • 可能是因为消息打印到std_err 而不是std_out。顺便说一句,这比 python 更像是一个 bash/unix 问题。

标签: python linux bash macos python-2.7


【解决方案1】:

您正在重定向stdout,但您的程序正在写入stderr。解决方法是重定向stderr:

$ sfood-checker path/to/folder 2> check.txt

或重定向 两者 stdoutstderr

$ sfood-checker path/to/folder &> check.txt

背景:最初创建进程时,它们通常总是已经为它们打开了三个初始文件描述符:

  • 0,stdin,“标准输入”,只读流
  • 1,stdout,“标准输出”,只写流
  • 2,stderr,“标准错误”,只写流

除了约定和文件描述符编号之外,stdoutstderr 之间的差异正好为零。按照惯例,然后,状态消息和其他“信息”内容输出到 stderr(fwrite(stderr, informational_data); 的某些版本,程序正常运行所需的数据写入到 stdout。

【讨论】:

  • 感谢工作,这是主要的事情,但是当它不是错误消息时,他们为什么要编写一个输出到stderr 的包?
  • 语法 cmd &> file 是不符合标准的 bash 扩展。一些 shell 实际上会遵循标准并在后台运行 cmd ,然后是截断文件的第二个命令(无操作)。最好写cmd > file 2>&1
  • @WilliamPursell 你当然不会学究气。好点子。
  • @cardamom 一些期望其输出被进一步解析的程序会选择将不属于其预期输出的所有内容写入stderr,即使它不是错误消息。诸如报告输入参数之类的事情。
  • @Arne 谢谢澄清,蛇食作者选择这样做。可能这也是 Mac 与 Linux 的行为..“一些 shell”
猜你喜欢
  • 2015-10-30
  • 1970-01-01
  • 2020-10-14
  • 1970-01-01
  • 2015-06-26
  • 2018-12-09
  • 2018-06-07
  • 1970-01-01
  • 2017-04-24
相关资源
最近更新 更多