python用popen;调用可执行文件,无法访问可执行文件写入的文件

问题描述 投票:0回答:1

我有一个 C++ 文件

#include <cstdio>

int main(int iArgC, char *apArgV[]) {
    int iResult = -1;
    if (iArgC > 1) {
        FILE *fOut = fopen(apArgV[1], "wt");
        if (fOut != NULL) {
            fprintf(fOut, "hello\n");
            fprintf(fOut, "goodbye\n");
            fclose(fOut);
            printf("Written `%s`\n", apArgV[1]);
            iResult = 0;
        } else {
            printf("Coudn´t open %s\n", apArgV[1]);
        }
    } else {
        printf("I need an argument\n");
    }
    return 0; 
}

我是这样编译的

g++ -g -o hello hello.cpp

当我运行

./hello /home/jody/hihi,txt
时,文件
hihi.txt
被写入。

然后我有这个Python脚本

#!/usr/bin/python

import subprocess as sp
import time

def callHello(file_name) :
    command = ["/home/jody/progs/polyhedronLED/version_c/hello", file_name]
    proc = sp.Popen(command,
                    stdout=sp.PIPE,
                    stderr=sp.PIPE)
    sOut, sError = proc.communicate()
    iResult = proc.returncode
    print("return code: %d"%iResult)
    print("Output:      %s"%sOut)
# -- end def

if __name__ == '__main__':
    file_name0 = "/home/jody/hihi.txt"
    callHello(file_name0)
    
    ff = open(file_name0, "wt")
    lines = ff.readlines()
    ff.close()
    print("output\n%s"%lines)
# -- end if

当我运行这个脚本时,我得到输出:

return code: 0
Output:      b'Written `/home/jody/hihi.txt`\n'
Traceback (most recent call last):
  File "/home/jody/progs/polyhedronLED/version_c/./hellocall.py", line 22, in <module>
    lines = ff.readlines()
            ^^^^^^^^^^^^^^
io.UnsupportedOperation: not readable

但是当我随后检查输出目录时,文件

hihi.txt
已被写入。

在拨打

time.sleep(5)
之后我也尝试过延迟
callHello()
,但结果是一样的。

然后我编写了一个 bash 脚本,它调用

hello
并随后读取文件的内容:这按预期工作。

何时(或如何)可以在 python 中实际访问子进程写入的文件?

python subprocess
1个回答
0
投票

正如评论中提到的,您以只写模式打开了文件。将第 21 行从

ff = open(file_name0, "wt")
更改为
ff = open(file_name0, 'rt')
或只是
ff = open(file_name0)
。如果您需要读取和写入文件,您可以传递
'wt+'
作为第二个参数以读写模式打开它。

© www.soinside.com 2019 - 2024. All rights reserved.