从基于 Popen() 的子进程写入的文件读取不完整

Incomplete reads from file written by Popen()-based subprocess

我正在尝试将一个函数的输出读入另一个函数。

如果我将事情分解为两个步骤,从命令行调用第一个函数 (journal.py),然后调用第二个函数 (ip_list.py),我得到的结果是正在寻找。

如果我尝试导入第一个并 运行 在第二个中导入它,结果列表为空。

import re
import journal

journal.journal()
ip_list = []
with open('Invalid_names_file') as file1:
    print(file1)
    a = [re.search(r'((\d+\.)+\d+)', line).group() for line in file1]
    print(a)
    for x in a:
        if x not in ip_list:
            ip_list.append(x)

print(ip_list)

输出->

<_io.TextIOWrapper name='Invalid_names_file' mode='r' encoding='UTF-8'>
[]
[]

当以这种方式调用时,我正在打开的文件就在那里(一旦脚本完成 运行ning),正如我所期望的那样,但我无法读取它当我尝试将其包含在导入中时从中获取。

我有 print() 以便我可以尝试了解正在发生的事情,但无法理解它。

journal.py是写文件的Popen命令

为克里斯编辑

journal.py

from subprocess import Popen
import os

def journal():
    with open('Invalid_names_file', 'w') as Invalid_names_file:
        Popen('journalctl -u sshd.service --no-pager --since -168hours\
                --until today | grep Invalid', stdout=Invalid_names_file,\
                universal_newlines=True, bufsize=1, shell=True)
        if os.stat('Invalid_names_file').st_size == 0:
            Popen('journalctl -u ssh.service --no-pager --since -168hours\
                    --until today | grep Invalid', stdout=Invalid_names_file,\
                    universal_newlines=True, bufsize=1, shell=True)
    Invalid_names_file.close()

您应该等待 Popen() 完成。 将其 return 值分配给变量并对其调用 wait()

p = Popen('journalctl ...')
p.wait()

当您单独 运行 日志脚本时,父进程只会 return 当它的所有子进程都终止时。 然而,Popen() 不会等待——除非你告诉它。 因此,在您的情况下,journal() 函数在启动子进程后立即退出,因此当您读取目标文件时,它仍然是空的或不完整的。