【问题标题】:How do I get the log file a program creates when running it with subprocess.call()?使用 subprocess.call() 运行程序时如何获取程序创建的日志文件?
【发布时间】:2016-04-19 22:50:25
【问题描述】:

我使用 Gaussian,这是一个用于分子几何优化的程序,以及其他应用程序。 Gaussian 可能需要几天时间才能结束一次优化,所以我决定在 Python 上编写一个程序,以便在它完成运行时向我发送一封电子邮件。电子邮件发送我想通了。问题是 Gaussian 自动生成了一个 log 文件和一个 chk 文件,里面包含了过程的实际结果,并且通过使用subprocess.call(['command'], shell=False) 两个文件都没有生成。

我也试过用os.system(command)解决这个问题,给了我.log文件和.chk文件,但是没有等待优化完成就发送了邮件。

另一件重要的事情,我必须在后台运行整个进程,因为正如我在开始时所说的,可能需要几天时间才能结束,而且我不能让终端打开那么久。

【问题讨论】:

  • 保持终端打开可以通过screen实现。您需要从磁盘读取生成的文件并将它们包含在您的报告电子邮件中。日志文件的生成不依赖于调用方法。
  • 好吧,我设法解决了这个问题,我一直在寻找答案,我的错误很明显。要在终端上运行 Gaussian,我使用$ g09 input.com &,所以它在 bg 中运行。这就是我在subprocess.call(['command']os.system(command) 上使用的命令。问题是&,不知何故os.system() 不会等待进程以它结束。通过不使用&,它成功了。 (还是不能用subprocess.call()

标签: python subprocess os.system


【解决方案1】:

使用subprocess.call(['command'], shell=False) 不会生成这两个文件。

Your comment 建议您尝试运行 subprocess.call(['g09 input.com &'], shell=False) 这是错误的。

您的代码应该引发FileNotFoundError。如果你没有看到它;这意味着stderr 被隐藏。您应该修复它(确保您可以看到sys.stderr.write('stderr\n') 的输出)。默认情况下,stderr 不隐藏,即您启动父脚本的方式已损坏。为了能够断开会话,请尝试:

$ nohup python /path/to/your_script.py &>your_script.log &

或使用screentmux

shell=False(顺便说一句,它是默认的——不需要显式传递它)应该强烈暗示call() 函数不需要 shell 命令。事实上,subprocess.call() 接受一个可执行文件及其参数作为一个列表,而不是运行 shell:

subprocess.check_call(['g09', 'input.com', 'arg 2', 'etc'])

注意:如果g09 返回非零退出代码(通常表示错误),check_call() 会引发异常。

【讨论】:

  • 对不起,我不是故意的,我使用command.split() 是为了将命令作为列表给出。
  • @DanielWatanabe 单独拆分在这里无济于事。 g09& 一无所知(没有 shell 可以解释 &)。您应该在g09 start 上看到错误。
  • 我现在明白了,我不明白它确实运行了命令。为了测试它是否正在运行,我做了一个输入,几分钟后会给出一个特定的错误消息,我收到了那个消息,这对我来说足以说明它运行但没有给我预期的日志文件
  • 但是谢谢,现在我明白为什么“&”不起作用了,这很明显。正如我在之前的 cmets 中所说,我已经设法用os.system() 解决了这个问题。现在我编辑了我的脚本以使用subprocess.call()cutting 关闭&并在终端中以$ script.py input.com & 运行该命令!
猜你喜欢
  • 2017-07-11
  • 2017-07-17
  • 2017-11-21
  • 1970-01-01
  • 2023-03-19
  • 2011-06-09
  • 2012-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多