跨不同平台的python中errno模块的可用性

时间:2014-05-08 13:29:43

标签: python python-3.x errno

在查看系统库socket.py实现时,我遇到了这段代码

try:
    import errno
except ImportError:
    errno = None
EBADF = getattr(errno, 'EBADF', 9)
EINTR = getattr(errno, 'EINTR', 4)

这段代码只是一个过去时代的遗物,还是有没有errno模块的平台/实现?

为了更明确,import errno没有异常处理程序是否安全?

我对python 2.x和3.x的答案感兴趣。

修改

澄清问题:我必须测试在IOError模块中引发的socket例外中编码的错误代码。上面的代码位于cpython code base中,让我对socket可用的已知情况感到怀疑,但import errno会失败。也许是一个小问题,但我想避免不必要的代码。

2 个答案:

答案 0 :(得分:1)

好吧,可能会出现errno可能无法使用的情况。我之前没有检查它,但是对于在非Unix系统上运行的python实现,例如windows,symbian ......以及在模拟器中运行的python实现(比如基于Javascript的python REPL)。

但是,如果您没有提供使用errno的替代方案,并且实际上是为其他系统使用套接字,我会说您可以安全地保持导入失败,因为您的代码赢了& #39;无法使用。您可能只想抓住它以抛出更明确的消息。

答案 1 :(得分:1)

从Python 1.4开始,

errno可用。 ENOENT等名称的可用性可能取决于平台:errno module source中有大量的ifdef s。在"errno.h"中检查了./configure标头,因此它可能无处可用(似乎在WinCE上没有使用),但它不应该阻止import errno

Here's the initial revision that introduces errno=None

 try:
-    from errno import EBADF
+    import errno
 except ImportError:
-    EBADF = 9
+    errno = None
+EBADF = getattr(errno, 'EBADF', 9)
+EINTR = getattr(errno, 'EINTR', 4)

我之前可以理解状态:from errno import EBADF可能会引发ImportError,因为EBADF可能在系统上不可用。国家之后,我不明白。我认为import errno在任何平台上都应该在CPython上取得成功。