当前位置: 首页 > 面试题库 >

从Python访问errno?

孙志
2023-03-14
问题内容

我被困在一个相当复杂的Python模块中,该模块不会返回有用的错误代码(它实际上会无声地失败而失败)。但是,它调用的基础C库设置了errno。

通常,errno是通过OSError属性传入的,但是由于我没有异常,因此无法理解。

使用ctypes时,libc.errno不起作用,因为errno是GNU libc中的宏。Python 2.6有一些优势,但Debian仍使用Python
2.5。将C模块插入我的纯Python程序中只是为了阅读errno,这使我感到恶心。

有什么办法可以访问errno?仅Linux的解决方案很好,因为要包装的库仅Linux。我也不必担心线程,因为我只会在可能失败的时间内运行一个线程。


问题答案:

更新:在 Python 2.6+上
,使用ctypes.get_errno()

Python 2.5

下面的代码不可靠(或全面,有多种方法errno可以定义),但它应该可以帮助您入门(或重新考虑您在小型扩展模块上的位置(毕竟在Debian上,python setup.py install或者easy_install在构建它时应该没有问题)) 。来自
http://codespeak.net/pypy/dist/pypy/rpython/lltypesystem/ll2ctypes.py

if not hasattr(ctypes, 'get_errno'):
    # Python 2.5 or older
    if sys.platform == 'win32':
        standard_c_lib._errno.restype = ctypes.POINTER(ctypes.c_int)
        def _where_is_errno():
            return standard_c_lib._errno()

    elif sys.platform in ('linux2', 'freebsd6'):
        standard_c_lib.__errno_location.restype = ctypes.POINTER(ctypes.c_int)
        def _where_is_errno():
            return standard_c_lib.__errno_location()

    elif sys.platform in ('darwin', 'freebsd7'):
        standard_c_lib.__error.restype = ctypes.POINTER(ctypes.c_int)
        def _where_is_errno():
            return standard_c_lib.__error()
    ctypes.get_errno = lambda: _where_is_errno().contents.value

哪里standard_c_lib

def get_libc_name():
    if sys.platform == 'win32':
        # Parses sys.version and deduces the version of the compiler
        import distutils.msvccompiler
        version = distutils.msvccompiler.get_build_version()
        if version is None:
            # This logic works with official builds of Python.
            if sys.version_info < (2, 4):
                clibname = 'msvcrt'
            else:
                clibname = 'msvcr71'
        else:
            if version <= 6:
                clibname = 'msvcrt'
            else:
                clibname = 'msvcr%d' % (version * 10)

        # If python was built with in debug mode
        import imp
        if imp.get_suffixes()[0][0] == '_d.pyd':
            clibname += 'd'

        return clibname+'.dll'
    else:
        return ctypes.util.find_library('c')

# Make sure the name is determined during import, not at runtime
libc_name = get_libc_name() 
standard_c_lib = ctypes.cdll.LoadLibrary(get_libc_name())


 类似资料:
  • 我正在使用selenium-python,并且希望执行一个javascript脚本(通过。 此脚本使用,该脚本仅在Chrome上可用。我成功地使用了 启动chrome浏览器。使用执行脚本时,我得到如下内容:

  • 问题内容: 我正在编写一个使用OpenCV的Python绑定进行标记检测和其他图像处理的Python应用程序。我想使用OpenCV的CUDA模块来加速应用程序的某些部分,并在它们的文件中注意到它们似乎正在使用针对Python和Java的OpenCV导出宏。但是,即使我正在构建OpenCV,我似乎也无法访问那些CUDA函数。 是否有必要使用包装器(例如PyCUDA)来访问GPU功能(例如cudaar

  • 问题内容: 我有一个像下面这样的课程: 我想为源变量传递一个字符串,并访问同名的类成员。 我已经尝试过仅对函数有效(据我所知)以及具有extend和using ,但这也不起作用。做这个的最好方式是什么? 问题答案: 如果命名self的ANY属性(包括您的示例中的),将可以完美地工作。

  • 问题内容: 我需要一个允许我使用Java在Gmail中进行电子邮件操作(例如,发送/接收邮件)的库。 问题答案: 您是否看到过Java的g4j-GMail API? GMailer Java版API(g4j)是一组API,允许Java程序员与GMail进行通信。借助G4J,程序员可以制作基于GMail大量存储的基于Java的应用程序。

  • 问题内容: 您如何从Java 访问? 最后一行使编译器死于“ scala类型。None不带参数”。 由于“找不到符号构造函数None()”而失败: 由于“找不到符号变量无”而失败: 在2007年,这曾经奏效,但后来Scala改变了。Java编译器提供: 问题答案: 这可能起作用: def apply [A](x:A):Option [A] 一个Option工厂,如果参数不为null,则创建Some

  • 问题内容: 我在访问SimpleXML对象的部分时遇到问题。当我整个对象时,我得到正确的输出,而当我其余对象(嵌套标签)时,我得到正确的输出,但是当我遵循docs和时 ,我得到一个空对象,尽管事实是第一个清楚地表明,存在要输出的属性。 任何人都知道我在这里做错了/如何进行这项工作? 问题答案: 您可以通过在XML节点上调用attribute()函数来获取XML元素的属性。然后,您可以var_dum