使用subprocess.call()运行程序时如何获取程序创建的日志文件?

时间:2016-04-19 22:50:25

标签: python subprocess os.system

我使用Gaussian,这是一个分子几何优化程序,以及其他应用程序。高斯可能需要几天才能结束单个优化,因此我决定在Python上创建一个程序,以便在完成运行时向我发送电子邮件。发消息的电子邮件我发现了。问题是Gaussian会自动生成一个日志文件和一个chk文件,其中包含该过程的实际结果,并且使用Camera不会生成这两个文件。

我还尝试使用subprocess.call(['command'], shell=False)来解决问题,它为我提供.log文件和.chk文件,但是无需等待优化完成即可发送电子邮件。

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

1 个答案:

答案 0 :(得分:0)

  

使用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'])

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