Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何限制python子进程创建的文件大小?_Python - Fatal编程技术网

如何限制python子进程创建的文件大小?

如何限制python子进程创建的文件大小?,python,Python,我从python运行一个子流程,如下所示(不是我的脚本): 有时,这个过程会变得疯狂(由于一个间歇性错误),并将大量错误转储到stdout/logfile中,使其增长到40Gb并填满磁盘空间 防止这种情况发生的最好办法是什么?作为一名python新手,我有两个想法: 将子流程管道化为类似于head的内容,如果输出增长超过限制,将中止它(不确定subprocess.run是否可以实现这一点,或者我是否必须使用低级别Popen方式) 查找或创建一些方便的IO包装器类IOLimiter,该类IOLi

我从python运行一个子流程,如下所示(不是我的脚本):

有时,这个过程会变得疯狂(由于一个间歇性错误),并将大量错误转储到stdout/logfile中,使其增长到40Gb并填满磁盘空间

防止这种情况发生的最好办法是什么?作为一名python新手,我有两个想法:

  • 将子流程管道化为类似于
    head
    的内容,如果输出增长超过限制,将中止它(不确定subprocess.run是否可以实现这一点,或者我是否必须使用低级别Popen方式)

  • 查找或创建一些方便的IO包装器类IOLimiter,该类IOLimiter将在给定大小后抛出错误(在stdlib中找不到类似的内容,甚至不确定在何处查找)

我怀疑会有更聪明/更干净的方法吗?

我最近有自己的方法。我使用
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.

尝试添加日志记录并表示感谢。。我希望不必改变使用Popen,但这看起来不错,但我想你应该考虑终止进程,还有超时等等(以及run()所做的任何事情)。我的另一个担忧是性能——忘了提到这个文件最终是40G——所以我更喜欢一些优化的处理,而不是python循环。。还是我不该担心呢?无论如何都要用澄清来更新问题。是的,根据您的应用程序,交互有各种考虑因素。这至少为您提供了一个非阻塞的情况和一个相当有效的循环:请记住,这是管道的一端,因此循环仅在子进程写入一行时迭代。否则,父进程只是在等待。
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.