2 Stimmen

Tiefer Fehler auf socket.py: TypeError: es wird eine Fließkommazahl benötigt

Ich habe eine Funktion geschrieben, um eine Aufgabe asynchron über Celery auszuführen, habe sie lokal getestet und alles funktioniert gut. Als ich sie in meine Testumgebung verschoben habe und Celery versucht, die Aufgaben zu verarbeiten, schlägt es mit folgendem Traceback fehl.

Ich bin mir nicht einmal sicher, wie ich diesen Fehler debuggen soll, da er von Celery aufgerufen wird und tief in der Python-Standardbibliothek auftritt. Irgendwelche Ideen?

Traceback (most recent call last):
  File "/home/ubuntu/hypnos-venv/local/lib/python2.7/site-packages/celery/app/trace.py", Zeile 238, in trace_task
    R = retval = fun(*args, **kwargs)
  File "/home/ubuntu/hypnos-venv/local/lib/python2.7/site-packages/celery/app/trace.py", Zeile 416, in __protected_call__
    return self.run(*args, **kwargs)
  File "/home/ubuntu/Hypnos/hypnos/recs_jobber/tasks.py", Zeile 5, in send_sms_action
    msg = twilio_client.sms.messages.create(body = sms_action.body, to=sms_action.to_number, from_=TW_NUMBER)
  File "/home/ubuntu/hypnos-venv/local/lib/python2.7/site-packages/twilio/rest/resources/sms_messages.py", Zeile 167, in create
    return self.create_instance(kwargs)
  File "/home/ubuntu/hypnos-venv/local/lib/python2.7/site-packages/twilio/rest/resources/base.py", Zeile 352, in create_instance
    data=transform_params(body))
  File "/home/ubuntu/hypnos-venv/local/lib/python2.7/site-packages/twilio/rest/resources/base.py", Zeile 204, in request
    resp = make_twilio_request(method, uri, auth=self.auth, **kwargs)
  File "/home/ubuntu/hypnos-venv/local/lib/python2.7/site-packages/twilio/rest/resources/base.py", Zeile 129, in make_twilio_request
    resp = make_request(method, uri, **kwargs)
  File "/home/ubuntu/hypnos-venv/local/lib/python2.7/site-packages/twilio/rest/resources/base.py", Zeile 101, in make_request
    resp, content = http.request(url, method, headers=headers, body=data)
  File "/home/ubuntu/hypnos-venv/local/lib/python2.7/site-packages/httplib2/__init__.py", Zeile 1570, in request
    (response, content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey)
  File "/home/ubuntu/hypnos-venv/local/lib/python2.7/site-packages/httplib2/__init__.py", Zeile 1317, in _request
    (response, content) = self._conn_request(conn, request_uri, method, body, headers)
  File "/home/ubuntu/hypnos-venv/local/lib/python2.7/site-packages/httplib2/__init__.py", Zeile 1252, in _conn_request
    conn.connect()
  File "/home/ubuntu/hypnos-venv/local/lib/python2.7/site-packages/httplib2/__init__.py", Zeile 1017, in connect
    sock.settimeout(self.timeout)
  File "/usr/lib/python2.7/socket.py", Zeile 224, in meth
    return getattr(self._sock,name)(*args)
TypeError: es wird ein Wert vom Typ float benötigt

Ich habe Celerys rdb verwendet, um in den Rahmen zu gelangen, und es scheint, dass das Timeout für den Socket nicht festgelegt ist.

(Pdb) self.timeout

Habt ihr Ideen, wie ich das lösen könnte? Der Fehler kommt von Twilio -> httplib2 -> socket.py, was ein Wrapper für _socket ist. Das ist über meinen Horizont und ich bin mir nicht sicher, wie ich das Problem angehen soll.

2voto

leonsas Punkte 4586

Standardmäßig setzt Twilios Lib den Timeout auf:

class _UnsetTimeoutKls(object):
    """ Ein Sentinel für einen nicht eingestellten Timeout. Standardmäßig auf den Systemtimeout gesetzt. """
    def __repr__(self):
        return ''

# None hat eine besondere Bedeutung für Timeouts, daher verwenden wir dieses Sigil, um anzuzeigen,
# dass es uns nicht interessiert
UNSET_TIMEOUT = _UnsetTimeoutKls()

Also muss etwas passieren zwischen der Instanziierung eines TwilioRestClient und dem tatsächlichen Socket-Aufruf, der _UnsetTimeoutKls zu etwas anderem als None auswertet.

Das Setzen des Timeouts auf None beim Initialisieren des TwilioRestClient scheint den Fehler zu beheben:

self.client = TwilioRestClient(TWILIO_SID,
                    TWILIO_AUTH_TOKEN,
                    timeout=None)

1voto

icktoofay Punkte 121675

Hier ist was passiert:

  • Sie sagen der Twilio-Bibliothek, eine SMS-Nachricht zu erstellen.
  • Twilio geht zu httplib, um eine Verbindung zu den Twilio-Servern herzustellen.
  • httplib setzt beim Verbinden mit den Twilio-Servern den Timeout eines Sockets.

Das einzige Problem ist, dass aus irgendeinem Grund self.timeout im vorletzten Stack-Rahmen nicht als float vorliegt, wie erforderlich. Sie möchten möglicherweise versuchen, Ihre Anwendung unter dem Python-Debugger auszuführen, z. B.:

python -m pdb myapp.py

Sie gelangen zu einer Eingabeaufforderung, von der aus Sie run eingeben können, um Ihre Anwendung auszuführen. Sobald der Fehler auftritt, sollte er Sie zurück zur Eingabeaufforderung bringen. Dann sollten Sie up eingeben können, bis Sie zum fehlerhaften Frame gelangen und sehen, was self.timeout ist. Möglicherweise möchten Sie dann herumschauen, um zu sehen, wo self.timeout auf diese Weise festgelegt wird und warum. Sie sollten dann in der Lage sein, das Problem zu beheben, indem Sie das korrigieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X