Python如何访问OS API函数,例如socket()?

时间:2015-07-02 16:50:15

标签: python sockets

更新的问题:

  1. 实际上是在哪里创建套接字对象?我在socketmodule.c的第4188行找到了这个,但看起来它被称为sock_new而不是套接字?

    static PyObject *sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
    
  2. 是否有一些约定用于确定导入socketmodule.c之类的模块的位置?换句话说,当我从_socket import *"中看到"我是谁知道导入的内容(不搜索整个存储库)?

  3. ORIGINAL:

    sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
    

    我试图理解这段代码是如何工作的,具体是如何/在哪里Python实际上使OS函数调用socket():

    class _socketobject(object):
    
        __doc__ = _realsocket.__doc__
    
        __slots__ = ["_sock", "__weakref__"] + list(_delegate_methods)
    
        def __init__(self, family=AF_INET, type=SOCK_STREAM, proto=0, _sock=None):
            if _sock is None:
                _sock = _realsocket(family, type, proto)
            self._sock = _sock
            for method in _delegate_methods:
                setattr(self, method, getattr(_sock, method))
    

    当我在维基百科上查找BSD套接字时,我看到这个例子是有意义的,因为套接字函数是在types.h下定义的。在上面我看到一个看起来像OS函数调用的realsocket调用,但我没有在任何地方定义realsocket(我在Python27 / include头文件中根本没有看到任何关于套接字的东西)。

      /* Server code in C */
    
      #include <sys/types.h>
      #include <sys/socket.h>
      #include <netinet/in.h>
      #include <arpa/inet.h>
      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>
      #include <unistd.h>
    
      int main(void)
      {
        struct sockaddr_in stSockAddr;
        int SocketFD = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
    

1 个答案:

答案 0 :(得分:5)

它与 socket.py 中的1 st 和2 nd 行有关:

import _socket
from _socket import *

如果你启动 Python 并运行以下代码:

import socket
print dir(socket)
print dir(socket._socket)

您会注意到套接字只会导出一些与socket._socket相比的额外内容。

现在,socket._socket是什么?它是一个 Python 动态模块(意味着它可以像任何其他python模块一样使用),但它是用 C 编写的(所以在编译后它有操作系统特定的本机格式: Nix .dll .pyd 下的 .so >) Win 下。它的位置在python lib文件夹中( socket.py 也位于其中): lib-dynload / _socket * .so

您可以通过打印模块来查看模块的位置(在您运行上述代码的同一控制台中可以输入):

print socket
print socket._socket

如果您对此感兴趣,其源代码位于 $ {PYTHON_SRC_DIR} /Modules/socketmodule.c 中的 Python 源代码tarball中(它也是有一个头文件)。在这些文件中,定义了包装函数(从 Python 可见),它们调用本机函数(例如 socket /usr/include/sys/socket.h)。