更新された質問:
ソケットオブジェクトは実際にどこで作成されますか? socketmodule.c の4188行目でこれを見つけましたが、socketではなくsock_newと呼ばれているようです。
static PyObject *sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Socketmodule.cのようなモジュールがどこにインポートされるかを理解するための規則はありますか?つまり、「from _socket import *」が表示された場合、(リポジトリ全体を検索せずに)何をインポートしているのか誰にわかりますか?
元の:
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と関係がありますst と2ndsocket.pyからの行:
import _socket
from _socket import *
Pythonを起動し、次のコードを実行した場合:
import socket
print dir(socket)
print dir(socket._socket)
socketは、socket._socket
と比較していくつかの余分なものしかエクスポートしないことに気付くでしょう。
さて、socket._socket
とは何ですか?これはPythonダイナミックモジュールです(つまり、他のpythonモジュールと同じように使用できます)が、[〜#〜]で記述されています。 c [〜#〜](したがって、コンパイル後は[〜#〜] os [〜#〜]特定のネイティブ形式になります:。so under- Nixおよび。dll(。pyd)の下Win)その場所はpython libフォルダー(socket.pyもあります):lib-dynload/_socket * .so。
モジュールを印刷することで、モジュールがどこにあるかを確認できます(上記のコードを実行したのと同じコンソールで入力できます)。
print socket
print socket._socket
さらに興味がある場合は、そのソースコードはPython source tarball in $ {PYTHON_SRC_DIR} /Modules/socketmodule.cにあります(ヘッダーファイルもあります) 。これらのファイルでは、ラッパー関数(Pythonから表示)が定義されており、ネイティブ関数(例:socket from /usr/include/sys/socket.h)。