gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 16:08:15 27 4
gpt4 key购买 nike

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

如果我将事情分为两步,从命令行调用第一个函数(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'>
[]
[]

以这种方式调用时,我要打开的文件就在那里(一旦脚本运行完毕),符合我的预期,但当我尝试包含时,我无法从中读取它与导入一起使用。

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

journal.py 是写入文件的 Popen 命令。

为克里斯编辑

期刊.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() 完成。将其返回值分配给一个变量并对其调用wait():

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

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

关于python - 从基于 Popen() 的子进程写入的文件中读取不完整,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39551660/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com