psutil在rlimit方法在rhel6上报错AttributeError: 'Process' object has no attribute 'rlimit'

问题描述

在centos6.5上使用psutil的rlimit方法报如下错误

>>> import psutil
>>> p=psutil.Process()
>>> p.rlimit(psutil.RLIMIT_CPU)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Process' object has no attribute 'rlimit'

问题原因

首先检查了psutil版本,是最新的4.1.0版本,rlimit函数应该已经包含在库中,所以排除了库版本太低的问题。

然后在{path_to_python}/site-packages/psutil/tests/test_linux.py文件中看到了一段描述很好的解释了这个问题,见下面代码片段

    @unittest.skipUnless(
        get_kernel_version() >= (2, 6, 36),
        "prlimit() not available on this Linux kernel version")
    def test_prlimit_availability(self):
        # prlimit() should be available starting from kernel 2.6.36
        p = psutil.Process(os.getpid())
        p.rlimit(psutil.RLIMIT_NOFILE)
        # if prlimit() is supported *at least* these constants should
        # be available

说明,rlimit函数只在linux kernel 2.6.36及以上版本可用,所以果断查看系统kernel版本

$ uname -a
Linux fanbinlinux 2.6.32-573.22.1.el6.x86_64 #1 SMP Wed Mar 23 03:35:39 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

原来是2.6.32,好吧,命背,不过总算找到问题原因了。

解决办法

升级内核

呵呵,这是逗你玩的解决方案,很多情况用户不可能允许你升级内核,当然如果允许,这是最简单的解决办法。

换用resource库

查看python的官方文档,发现可以使用标准库resource的getrlimit和setrlimit方法实现,resource库和psutil库的区别就是resource库只能对当前进程设置或查询rlimit,而psutil可以针对任意进程。

下面是resource库的用法

import resource
resource.getrlimit(resource.RLIMIT_CPU)
resource.setrlimit(resource.RLIMIT_CPU, xxx)

参考 https://docs.python.org/2/library/resource.html

转载请以链接形式标明本文地址
本文地址:http://blog.csdn.net/kongxx/article/details/51189373

你可能感兴趣的:(python)