Python resource模块无法获取pipe size、虚拟内存限制,求非ulimit subprocess替代方案
资源限制获取方案
虚拟内存(virtual memory)获取
你要的shell可使用的最大虚拟内存限制,对应resource模块中RLIMIT_AS参数,该参数定义为进程地址空间上限,和ulimit输出的virtual memory完全等价。直接调用标准库接口即可获取:
import resource # 返回值为(软限制, 硬限制),单位为字节,除以1024即可对齐ulimit默认的KB单位 vmem_soft, vmem_hard = resource.getrlimit(resource.RLIMIT_AS)
你之前没有对应上是因为部分系统ulimit输出时将该参数命名为virtual memory,而resource.h中使用的是标准命名RLIMIT_AS。
管道大小(pipe size)获取
管道大小不属于rlimit资源限制集合,因此不会在resource.h的rlimit枚举中定义,也无法通过resource模块直接获取,你可以使用Python标准库fcntl模块实现,仅支持Linux 2.6.35及以上版本(覆盖目前绝大多数主流发行版):
import fcntl import os # 创建临时管道获取文件描述符 r_fd, w_fd = os.pipe() # 获取管道大小,返回值单位为字节,除以512即可得到ulimit输出的512字节块计数 pipe_size = fcntl.fcntl(w_fd, fcntl.F_GETPIPE_SZ) # 关闭临时管道的文件描述符 os.close(r_fd) os.close(w_fd)
如果需要获取系统全局的默认最大管道大小,直接读取/proc/sys/fs/pipe-max-size文件即可,内容为字节数值。
内容的提问来源于stack exchange,提问作者Ameen Ali Shaikh
相关产品推荐
相关产品推荐

