【问题标题】:Python: subprocess not writing output filesPython:子进程不写入输出文件
【发布时间】:2016-09-28 08:00:15
【问题描述】:

使用 Python 的 subprocess.call,我正在尝试调用一个 C 程序来读取磁盘上的输入文件,并创建多个输出文件。从终端运行 C 程序会得到预期的结果,但 subprocess.call 不会。

在最小示例中,程序应读取临时文件夹中的输入文件,并在同一文件夹中创建输出文件。输入和输出文件的位置和名称被硬编码到 C 程序中。

import subprocess


subprocess.call('bin/program.exe') # parses input file 'scratch/input.txt'
with open('scratch/output.txt') as f:
    print(f.read())

这会返回:

FileNotFoundError: [Errno 2] No such file or directory: 'scratch/output.txt'

我做错了什么?

使用subprocess.check_output,我看不到任何错误。

编辑: 所以我看到涉及子进程工作目录。 C 可执行文件具有相对于 exe 的输入/输出硬编码路径(即,'../scratch/input.txt'),但 subprocess.call() 调用需要路径相对于 python 脚本,不是exe。这是出乎意料的,并且从终端调用 exe 会产生非常不同的结果。

【问题讨论】:

  • 我会建议使用“导入命令”;使用它,您还将获得 C 程序的输出(您可以在 gcc 中以正常方式运行它),如果失败,状态代码将更改。例如。输出 = commands.getstatusoutput("gcc test.c")
  • @abhijeetmote commands 模块已被 subprocess 模块淘汰。

标签: python subprocess


【解决方案1】:
import os

subprocess.call('bin/program.exe') # parses input file 'scratch/input.txt'
if not os.path.isfile('scratch'):
    os.mkdir('scratch')
with open(os.path.join('scratch','output.txt'), 'w') as f:
    f.write('Your message')

您必须以模式打开文件。例如阅读。您需要使用 os.path.join() 加入路径。

如果文件夹和文件不存在,您可以创建它们。但是没有什么可以读的。如果你想写信给他们,可以如上所示。

【讨论】:

  • 如果未指定文件模式,则默认为读取。此外,问题不在于读取输出文件,而是没有创建输出。
  • 你不能从一个不存在的文件中读取——无论如何,我更新了我的答案来创建一个你可以写入的文件和文件夹。
  • 我很感激虽然无法读取不存在的文件,但我担心的是为什么没有创建输出文件。从终端调用 C 程序会在暂存文件夹中创建预期的输出文件,而通过 subprocess.call 调用它不会创建任何输出文件。输入和输出文件的位置和名称被硬编码到 C 程序中。 subprocess.check_output 也不会产生错误,这与我删除输入文件不同,在这种情况下 check_output 包含 C 程序的相关错误消息。
  • 抱歉,尝试print subprocess.call() 或检查if subprocess.call()!=0 print 'failure' 它也可能需要更多时间才能完成运行exe。在这种情况下,您可以使用while subprocess.call != 0: pass 等待它完成
  • 我对@9​​87654328@的理解是,默认情况下它会等待子进程完成,然后再继续。此外,如果我将脚本简化为仅调用子进程,并删除读取输出的尝试,它仍然完成,没有创建输出文件。
猜你喜欢
  • 2016-07-18
  • 2019-02-05
  • 1970-01-01
  • 1970-01-01
  • 2012-06-23
  • 1970-01-01
  • 1970-01-01
  • 2018-08-07
  • 1970-01-01
相关资源
最近更新 更多