2015-07-02 13 views
6

Câu hỏi CẬP NHẬT:Python truy cập các chức năng OS API như socket() như thế nào?

  1. đâu đối tượng ổ cắm thực sự được tạo ra? Tôi tìm thấy điều này tại dòng 4188 trong socketmodule.c, nhưng có vẻ như nó được gọi là sock_new không phải socket?

    static PyObject *sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds) 
    
  2. Có một số quy ước để tìm ra nơi mô-đun như socketmodule.c được nhập không? Nói cách khác, khi tôi nhìn thấy một "từ _socket import *", tôi biết những gì đang nhập (mà không cần tìm kiếm toàn bộ kho lưu trữ)?


ORIGINAL:

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

Tôi đang cố gắng để hiểu cách mã này hoạt động đặc biệt như thế nào/nơi Python thực sự làm cho các cuộc gọi chức năng hệ điều hành đến 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)) 

Khi tôi tra cứu ổ cắm BSD trên Wikipedia, tôi thấy ví dụ này có ý nghĩa vì hàm socket được định nghĩa theo types.h. Ở trên tôi thấy một cuộc gọi đến realsocket trông giống như một cuộc gọi chức năng hệ điều hành, nhưng tôi không realsocket định nghĩa bất cứ nơi nào (tôi không thấy bất cứ điều gì về ổ cắm ở tất cả trong các tiêu đề Python27/bao gồm).

/* 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

Đối với tôi, có một socket.py trong thư mục Python27/lib. Có một số nhận xét trong tệp mô tả các cuộc gọi chức năng nền tảng có sẵn cụ thể. – bornruffians

+0

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

+0

Trong tarball 'Python2.7.10',' Modules/socketmodule.c' line 3192 (in 'sock_initobj' func)' fd = socket (gia đình, kiểu, proto); '.'sock_new' chỉ tạo đối tượng trình bao bọc' Python'. Đối với câu hỏi thứ hai của bạn 'socket.py' chỉ đơn giản là một trình bao bọc trên' _socket.so' và nó phơi bày mọi thứ mà mô-đun năng động thực hiện (+ một vài điều). Bạn có thể nhập trực tiếp '_socket' và xem các thành viên của nó. – CristiFati

Trả lời

5

Nó có tất cả mọi thứ để làm với 1 và dòng thứ 2 từ socket.py:

import _socket 
from _socket import * 

Nếu bạn bắt đầu trăn và chạy đoạn mã sau:

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

bạn sẽ nhận thấy rằng socket chỉ xuất thêm một vài thứ so với socket._socket.

Bây giờ, socket._socket là gì? Nó là một mô-đun động trăn (có nghĩa là nó có thể được sử dụng giống như bất kỳ mô-đun python nào khác), nhưng nó được viết bằng C (sau khi biên dịch nó có một dạng gốc riêng của hệ điều hành: .so trong Linux và .dll(.pyd) trong Windows). Vị trí của nó nằm trong thư mục lib python (trong đó socket.py cũng nằm): lib-dynload/_socket.so.

Bạn có thể nhìn thấy nơi các module được đặt bằng cách in chúng (trong cùng một giao diện điều khiển, nơi bạn chạy đoạn mã trên bạn có thể gõ):

print socket 
print socket._socket 

Nếu bạn quan tâm nhiều hơn, mã nguồn của nó nằm ở tarball nguồn Python trong Modules/socketmodule.c (nó cũng có một tệp tiêu đề). Trong các tệp đó, các hàm trình bao bọc Python (được hiển thị từ Python) được định nghĩa và chúng gọi các hàm gốc (ví dụ: socket() từ /usr/include/sys/socket.h).

+0

Đây là một câu trả lời hữu ích đáng sợ! Cảm ơn! Giúp tôi hiểu về socketmodule.c! – timbram

+0

Rất vui được hữu ích! – CristiFati

Các vấn đề liên quan