【问题标题】:How would you limit file size created by a python subprocess?你将如何限制由 python 子进程创建的文件大小?
【发布时间】:2019-01-29 19:07:29
【问题描述】:

我像这样从 python 运行一个子进程(不是我的脚本):

  with contextlib.redirect_stdout(log_file):
    # ....
    processResult = subprocess.run(args, 
                    stdout=sys.stdout, 
                    stderr=sys.stderr
                    timeout=3600)

有时进程会变得疯狂(由于间歇性错误)并将大量错误转储到标准输出/日志文件中,以至于它增长到 40Gb 并填满磁盘空间。

防止这种情况的最佳方法是什么?作为一个python新手,我有两个想法:

  • 将子进程通过管道连接到 head 之类的东西中,如果输出超出限制,则中止它(不确定 subprocess.run 是否可以实现,或者我是否必须采用低级别的 Popen 方式)

  • 查找或创建一些方便的 IO 包装类 IOLimiter,它会在给定大小后引发错误(在 stdlib 中找不到类似的东西,甚至不知道在哪里寻找它)

    李>

我怀疑会有一些更聪明/更清洁的方法?

【问题讨论】:

标签: python


【解决方案1】:

我最近有this problem自己。我是用popen方法做到的,设置PYTHONUNBUFFERED=1

test_proc = subprocess.Popen(
    my_command,
    universal_newlines=True,
    stdout=subprocess.PIPE,
    stderr=subprocess.STDOUT,
)

print(time.time(), "START")
# Iterate over the lines of output produced
for out_data in iter(test_proc.stdout.readline, ""):
    # Check whatever I need.

【讨论】:

  • 谢谢。 run() 正在做)。我的另一个问题是性能——忘了提到这个文件最终是 40G——所以更喜欢一些优化的处理而不是 python 循环..或者我不应该担心吗?无论如何都要通过澄清更新问题。
  • 是的,根据您的应用程序,交互有各种考虑因素。这至少为您提供了一种非阻塞情况和一个相当有效的循环:记住,这是管道的一端,因此循环仅在子进程写入一行时迭代。否则,父进程只是在等待。
猜你喜欢
  • 2019-10-26
  • 2023-02-24
  • 1970-01-01
  • 2021-03-08
  • 1970-01-01
  • 2013-12-18
  • 1970-01-01
  • 1970-01-01
  • 2015-12-20
相关资源
最近更新 更多