web-dev-qa-db-ja.com

Pythonはsocket()などのOS API関数にどのようにアクセスしますか?

更新された質問:

  1. ソケットオブジェクトは実際にどこで作成されますか? socketmodule.c の4188行目でこれを見つけましたが、socketではなくsock_newと呼ばれているようです。

    static PyObject *sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
    
  2. 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);
6
Charlie

それは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)。

5
CristiFati