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

How do I get the log file a program creates when running it with subprocess.call()?

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

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

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

by using subprocess.call(['command'], shell=False) both files are not generated.

表明您正在尝试 运行 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 &

或使用screen, tmux.

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

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

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