Python:子进程不写入输出文件

Python:子进程不写入输出文件,python,subprocess,Python,Subprocess,使用Python的subprocess.call,我试图调用一个C程序,该程序读取磁盘上的输入文件,并创建多个输出文件。从终端运行C程序会得到预期的结果,尽管子进程.call不会 在最简单的示例中,程序应该读取暂存文件夹中的输入文件,并在同一文件夹中创建输出文件。输入和输出文件的位置和名称硬编码到C程序中 import subprocess subprocess.call('bin/program.exe') # parses input file 'scratch/input.txt' w

使用Python的
subprocess.call
,我试图调用一个C程序,该程序读取磁盘上的输入文件,并创建多个输出文件。从终端运行C程序会得到预期的结果,尽管
子进程.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]没有这样的文件或目录:“scratch/output.txt”

我做错了什么

使用
子流程。检查\u输出
,我看不到任何错误

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

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程序的输出(您可以以在gcc中正常运行的方式运行它),如果失败,状态代码将更改。例如,output=commands.getstatusoutput(“gcc test.c”)@abhijeet注意,
子流程
模块会使
命令
模块过时。如果未指定文件模式,则默认为读取。此外,问题不在于读取输出文件,而在于没有创建输出。你不能从不存在的文件中读取-不管怎样,我更新了答案,创建了一个可以写入的文件和文件夹。我理解,虽然不存在的文件无法读取,但我关心的是为什么不创建输出文件。从终端调用C程序会在scratch文件夹中创建预期的输出文件,而通过
subprocess.call调用它不会创建任何输出文件。输入和输出文件的位置和名称硬编码到C程序中
subprocess.check\u output
也不会产生错误,这与删除输入文件不同,在这种情况下,
check\u output
包含C程序的相关错误消息。抱歉,请尝试
print subprocess.call()
或执行检查
if subprocess.call()=0打印“失败”
完成exe可能还需要更多时间。在这种情况下,您可以在subprocess.call!=0:pass
我对
子流程的理解是,默认情况下,它会等待子流程完成,然后再继续。此外,如果我将脚本简化为仅调用子流程,并删除读取输出的尝试,那么它仍然会完成,而不会创建输出文件。