2015-07-02 8 views
6

AKTUALISIERT Fragen:Wie greift Python auf OS-API-Funktionen wie socket() zu?

  1. Wo kommt das Socket-Objekt tatsächlich erstellt werden? Ich fand das bei Zeile 4188 in socketmodule.c, aber es sieht so aus, dass es sock_new nicht Socket genannt wird?

    static PyObject *sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds) 
    
  2. Gibt es eine Konvention für herauszufinden, wo ein Modul wie socketmodule.c importiert wird? Mit anderen Worten, wenn ich einen "from _socket import *" sehe, weiß ich, was importiert wird (ohne das gesamte Repository zu durchsuchen)?


ORIGINAL:

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

Ich versuche, diesen Code zu verstehen, wie funktioniert speziell wie/wo Python tatsächlich die OS-Funktionsaufruf macht an die Buchse():

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)) 

Wenn ich nach BSD-Sockets auf Wikipedia suche, sehe ich dieses Beispiel, das Sinn macht, weil die Socket-Funktion unter types.h definiert ist. Im obigen sehe ich einen Aufruf zum Realsocket, der wie ein OS-Funktionsaufruf aussieht, aber ich definiere Realsocket nirgendwo (ich sehe überhaupt nichts über Sockets in den Python27/Include-Headern).

/* 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); 
+0

Für mich gibt es eine socket.py im Ordner Python27/lib. Es gibt einige Kommentare in der Datei, die verfügbare plattformspezifische Funktionsaufrufe beschreiben. – bornruffians

+0

_realsocket = Socket unter https://github.com/certik/python-2.7/blob/master/Lib/socket.py#L100 –

+0

In 'Python2.7.10' Tarball,' Modules/socketmodule.c' Zeile 3192 (in 'sock_initobj' func)' fd = socket (Familie, Typ, Proto); '.'sock_new' erstellt nur das' Python'-Wrapper-Objekt. Wie für Ihre zweite Frage ist 'socket.py' einfach ein Wrapper über' _socket.so' und es macht alles aus, was das dynamische Modul tut (+ ein paar Dinge). Sie können '_socket' direkt importieren und seine Mitglieder sehen. – CristiFati

Antwort

5

Es hat alles mit der ersten und der zweiten Linien von socket.py zu tun:

import _socket 
from _socket import * 

Wenn Sie Python starten und den folgenden Code ausführen:

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

Sie werden bemerken, Das socket exportiert nur ein paar zusätzliche Dinge im Vergleich zu socket._socket.

Nun, was ist socket._socket? Es ist ein dynamisches Python-Modul (was bedeutet, dass es wie jedes andere Python-Modul verwendet werden kann), aber es ist in C geschrieben (nach der Kompilierung hat es ein OS-spezifisches natives Format: .so unter Linux und .dll(.pyd) unter Windows). Der Speicherort befindet sich im Ordner python lib (socket.py befindet sich ebenfalls): lib-dynload/_socket.so.

können Sie sehen, wo Module durch Drucken sie befinden (in der gleichen Konsole, wo Sie den obigen Code lief Sie geben könnte):

print socket 
print socket._socket 

Wenn Sie mehr daran interessiert sind, dann ist ihr Quellcode befindet sich in Die Python-Source-Tarball in Modules/socketmodule.c (es hat auch eine Header-Datei). In diesen Dateien sind die Python-Wrapper-Funktionen (die aus Python sichtbar sind) definiert und sie rufen die nativen Funktionen auf (z. B. socket() von /usr/include/sys/socket.h).

+0

Das ist so eine verdammt hilfreiche Antwort! Vielen Dank! Hat mir geholfen, socketmodule.c auch zu verstehen! – timbram

+0

Froh, hilfreich zu sein! – CristiFati

Verwandte Themen