Встроенный Python — [_socket получает методы модуля, НО socket.py: отсутствуют методы]

#c #sockets #google-app-engine #python-2.7 #marmalade

#c #сокеты #google-app-engine #python-2.7 #мармелад

Вопрос:

Python 2.7 встроен в промежуточную программу Marmalade C

Я внедрил python 2.7 в свою мобильную программу, используя промежуточное программное обеспечение Marmalade C (arm gcc). Я могу запускать большинство стандартных модулей и сторонних библиотек.

Когда я пытаюсь импортировать socket.py (убедитесь, что не запускаетесь в домашнем каталоге) в нем говорится, что в _socket отсутствуют методы:

сокет:

 >>> import socket
    
File "/pythonHome/Lib/socket.py", line 229, in <module>
[0xfa0] FILE: s3eFileOpen('/pythonHome/Lib/socket.py', 'rb') succeeded 
p.__doc__ = getattr(_realsocket,_m).__doc__

    AttributeError: type object '_socket.socket' has no attribute 'getpeername'
    

    
>>> import os
>>> os.chdir("/tmp")

[0xfa0] IWCRT: chdir: '/' -> '/tmp'
    
    

>>> import socket

    AttributeError: type object '_socket.socket' has no attribute 'getpeername'



>>> from socket import *

    AttributeError: type object '_socket.socket' has no attribute 'getpeername'
  

После многих проблем с модулем сокета он, наконец, компилируется, и я могу импортировать модуль _socket c (отображает все доступные методы):

_socket:

 >>> import _socket
>>> print (os.path.dirname(_socket.__file__))
        
        AttributeError: 'module' object has no attribute '__file__'
        
        
>>> print (dir("_socket"))
    
    ['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']


>>> dumpMod.dumpObj(_socket)

Documentation string:   """Implementation module for socket operations.  See
                        the socket module for documentation."""

Built-in Methods:       fromfd, getaddrinfo, getdefaulttimeout, gethostbyaddr
                        gethostbyname, gethostbyname_ex, gethostname
                        getnameinfo, getprotobyname, getservbyname
                        getservbyport, htonl, htons, inet_aton, inet_ntoa
                        inet_ntop, inet_pton, ntohl, ntohs, setdefaulttimeout

  __name__              _socket
  __package__           None
  

РЕДАКТИРОВАТЬ :: Вот ссылка, которая сравнивает обычные атрибуты _socket с моей скомпилированной версией _socket:http://www.diffchecker.com/di6k3fsc



РЕДАКТИРОВАТЬ Я изолировал функцию, выдающую ошибку из socket.py (Я вычел getpeername, чтобы проверить все остальные функции, они в порядке):

 import _socket

_socketmethods = (
    'bind', 'connect', 'connect_ex', 'fileno', 'listen', 'getsockname','getsockopt','setsockopt','sendall', 'setblocking','settimeout', 'gettimeout', 'shutdown')

for _m in _socketmethods:
    print(getattr(_socket.socket,_m).__doc__)
  

= вывод ( минус метод ‘getpeername’)

 bind(address)

Bind the socket to a local address.  For IP sockets, the address is a
pair (host, port); the host must refer to the local host. For raw packet
sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])
connect(address)

Connect the socket to a remote address.  For IP sockets, the address
is a pair (host, port).
connect_ex(address) -> errno

This is like connect(address), but returns an error code (the errno value)
instead of raising an exception when an error occurs.
fileno() -> integer

Return the integer file descriptor of the socket.
listen(backlog)

Enable a server to accept connections.  The backlog argument must be at
least 1; it specifies the number of unaccepted connection that the system
will allow before refusing new connections.
getsockname() -> address info

Return the address of the local endpoint.  For IP sockets, the address
info is a pair (hostaddr, port).
getsockopt(level, option[, buffersize]) -> value

Get a socket option.  See the Unix manual for level and option.
If a nonzero buffersize argument is given, the return value is a
string of that length; otherwise it is an integer.
setsockopt(level, option, value)

Set a socket option.  See the Unix manual for level and option.
The value argument can either be an integer or a string.
sendall(data[, flags])

Send a data string to the socket.  For the optional flags
argument, see the Unix manual.  This calls send() repeatedly
until all data is sent.  If an error occurs, it's impossible
to tell how much data has been sent.
setblocking(flag)

Set the socket to blocking (flag is true) or non-blocking (false).
setblocking(True) is equivalent to settimeout(None);
setblocking(False) is equivalent to settimeout(0.0).
settimeout(timeout)

Set a timeout on socket operations.  'timeout' can be a float,
giving in seconds, or None.  Setting a timeout of None disables
the timeout feature and is equivalent to setblocking(1).
Setting a timeout of zero is the same as setblocking(0).
gettimeout() -> timeout

Returns the timeout in floating seconds associated with socket
operations. A timeout of None indicates that timeouts on socket
operations are disabled.
shutdown(flag)

Shut down the reading side of the socket (flag == SHUT_RD), the writing side
of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).
  

Добавлен getpeername, единственный, с проблемой

 >>> import _socket
>>> print(getattr(_socket.socket,'getpeername').__doc__)

AttributeError: type object '_socket.socket' has no attribute 'getpeername'
  

Мысли?

  • Может ли это все еще быть проблемой с python path?

  • setenv в c

  • Еще один отсутствующий зависимый модуль? ( selectmodule.c также включен)

  • Поскольку скомпилированный модуль встроен в библиотеку, содержащую также entpreter, и там нет файла. нужно ли мне изменять socket.py…?

  • проблемы с getaddrinfo.c? getnameinfo.c ? >> проблемы с socketmodule.c?

Ответ №1:

РЕШАЕМАЯ

В pyconfig.h установите ИМЯ_GETPEERNAME 1 (при этом также получите имя хоста)

 /* Define to 1 if you have the `getpeername' function. */
//#undef HAVE_GETPEERNAME

/* Define to 1 if you have the `gethostbyname' function. */
//#undef HAVE_GETHOSTBYNAME




/* SOCKETS FUNCTION */

#define HAVE_GETPEERNAME 1


#define HAVE_GETHOSTBYNAME 1
  

Я загружал неправильный минимальный pyconfig, который не включал настройки для других модулей…. тем не менее, большинство из них работали, но не этот. Мы решаем