AKTUALISIERT Fragen:Wie greift Python auf OS-API-Funktionen wie socket() zu?
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)
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);
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
_realsocket = Socket unter https://github.com/certik/python-2.7/blob/master/Lib/socket.py#L100 –
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