我被困在一个相当复杂的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()
。
下面的代码不可靠(或全面,有多种方法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