Pyramid + tweepy: Globale name 'api' is not defined

Django, Flask, Bottle, WSGI, CGI…
Antworten
Floqqi

Hi,

hab 'nen kleinen Server hochgezogen, den ich nun mit einer Twitter API verbinden will. Nun hab ich tweepy mit easy_install installiert und klappt alles soweit. Meine IDE ist Eclipse mit der Pydev-Erweiterung.
Noch paar nützliche Sachen: Python v2.7.1 + tweepy v1.7.1 + Windows 7

Code: Alles auswählen

import tweepy
from pyramid.session import UnencryptedCookieSessionFactoryConfig
from pyramid.config import Configurator

def twitter(request):
    my_session_factory = UnencryptedCookieSessionFactoryConfig('test')
    Configurator(session_factory = my_session_factory)
    

    auth = tweepy.OAuthHandler("XXX",
                               "XXX",
                               "http://XXX")
    auth.get_authorization_url()
    
    request.session = {}
    request.session["key"] = auth.request_token.key
    request.session["secret"] = auth.request_token.secret
    auth = tweepy.OAuthHandler("XXX",
                               "XXX",
                               "http://XXX")
    
    key = request.session["key"]
    secret  = request.session["secret"]
    del request.session
    auth.set_request_token(key, secret)
    
    api = tweepy.API(auth)
    api.update_status("es klappt :)")
Nun bekomm ich die Meldung "unresolved import" in der ersten Zeile des Codes. Bin dem Tutorial von tweepy allerdings Schritt für Schritt gefolgt. # Die kommt aber von Eclipse und könnte meinetwegen ignoriert werden, aber ich glaube sie hat was mit meinem Problem zu tun.

Nun das Hauptproblem:
Wenn ich die Funktion aufrufe bekomm ich die Fehlermeldung: "NameError: global name 'api' is not defined", was sich anscheinend auf die Zeilen:

Code: Alles auswählen

api = tweepy.API(auth)
api.update_status("es klappt :)")
bezieht..

Ich hab auch schon "from tweepy.api import API", ... probiert.


Mit freundlichen Grüßen,
Floqqi
BlackJack

@Floqqi: Wenn in der Fehlermeldung tatsächlich 'api' steht, kann das ja nichts mit 'API' zu tun haben!? Und warum glaubst Du nur dass sich das auf die beiden Zeilen bezieht? Auf welche Zeile bezieht es sich denn *genau*? Das steht doch im Traceback. Könntest Du den *komplett* zeigen!?

Wie sieht's ohne IDE aus?
Floqqi

Code: Alles auswählen

File 'C:\\Python27\\lib\\site-packages\\weberror-0.10.3-py2.7.egg\\weberror\\evalexception.py', line 431 in respond
  app_iter = self.application(environ, detect_start_response)
File 'C:\\Python27\\lib\\site-packages\\repoze.tm2-1.0b1-py2.7.egg\\repoze\\tm\\__init__.py', line 23 in __call__
  result = self.application(environ, save_status_and_headers)
File 'C:\\Python27\\lib\\site-packages\\pyramid-1.0b2-py2.7.egg\\pyramid\\router.py', line 158 in __call__
  response = view_callable(context, request)
File 'C:\\Python27\\lib\\site-packages\\pyramid-1.0b2-py2.7.egg\\pyramid\\config.py', line 2905 in _requestonly_view
  response = view(request)
File 'C:\\Users\\fkraus\\workspace\\wuma_medientage\\src\\mp.medientage\\mpmedientage\\views.py', line 445 in twitter
  api.update_status("es klappt :)")
File 'build\\bdist.win-amd64\\egg\\tweepy\\binder.py', line 190 in _call
File 'build\\bdist.win-amd64\\egg\\tweepy\\binder.py', line 137 in execute
NameError: global name 'api' is not defined
Eclipse sagt mir ja bloß dass es das Modul tweepy nicht erkennt/findet, auch wenn es vorhanden ist. Könnte vielleicht auch nur Eclipse liegen. Also lassen wir das mal außer Acht.

Die Variable 'api' definiere ich ja mit 'api = tweepy.API(auth)'.
BlackJack

@Floqqi: Hm, der gezeigte Quelltext hat keine 400+ Zeilen. Bist Du sicher das in dem Modul was tatsächlich ausgeführt wird, die Zeile mit dem ``api =`` in der Funktion `twitter()` vorhanden ist? Nicht das der Webserver da noch ein altes Modul im Speicher hat und ausführt.
Floqqi

Ich kann dich beruhigen der Quelltext ist ein bisschen länger als 445 Zeilen ;-). Das was in Zeile 445 steht ist aber dieses 'api.update_status("").
Ja, da bin ich mir ziemlich sicher ;)
Ich hab jetzt noch ein bisschen rumprobiert und mal eine andere Funktion als update_status aus der API-Klasse probiert.

Code: Alles auswählen

api = tweepy.api
api.lookup_users()
Das funktioniert soweit, allerdings bekomm ich dort als Traceback:
"TweepError: Authentication required!"
Diese Meldung bekomm ich, weil ich keinen Auth-Handler übergeben habe, welchen ich in der Variable 'auth' steckt. Nur irgendwie kann, bzw. darf ich den nicht übergeben.

Ich glaube ich versteh da nur irgendetwas falsch.




Hier der Originalcode des tweepy-Moduls (api-Klasse):
https://github.com/joshthecoder/tweepy/ ... epy/api.py

Folgendes müsste doch rein theoretisch (nur vom logischen her) funktionieren:

Code: Alles auswählen

from tweepy.auth import OAuthHandler
from tweepy.api import API

auth = OAuthHandler("XXX", "XXX", "http://XXX")

api = API(auth_handler=auth)
api.update_status("test123")
Mit 'api = API(auth)' definiere ich ja die Klasse API mit dem Parameter 'auth_handler', welcher als Wert das OAuthHandler-Objekt beinhaltet. Wenn ich das ohne den Übergabeparameter mache, funktioniert es eig, allerdings hab ich mich ja dann bei Twitter nicht authentifiziert, drum kann ich meinen Status nicht updaten, bzw. andere Aktionen durchführen. Drum führt das wieder zu: "TweepError: Authentication required!".

Ich hoffe ich hab das Problem verständlich erklärt. :)
BlackJack

@Floqqi: Vielleicht solltest Du das ganze mal auf ein Minimalbeispiel reduzieren. Zum Beispiel ohne Pyramid, denn das Problem scheint ja bei `tweepy` zu liegen!?
Floqqi

BlackJack hat geschrieben:@Floqqi: Vielleicht solltest Du das ganze mal auf ein Minimalbeispiel reduzieren. Zum Beispiel ohne Pyramid, denn das Problem scheint ja bei `tweepy` zu liegen!?
Das hab ich schon versucht ;-)
Schau mal den letzten Abschnitt (zweites Codesnippet), dort müsste es doch rein vom logischen her, ohne Ahnung von dem Modul zu haben, funktionieren. Achte am besten nur mal, ob meine Syntax soweit stimmt. :-)

Danke soweit schon.
BlackJack

@Floqqi: Du hast aber nicht beschrieben was passiert wenn Du das so ablaufen lässt.
Floqqi

"NameError: global name 'api' is not defined"
Das passiert dann! Wenn ich den Code jetzt um folgendes ändere:

Code: Alles auswählen

hanswurst = API(auth_handler=auth)
hanswurst.update_status("test123")
Im Prinzip hab ich jetzt nur den Variablennamen geändert. Allerdings bekomm ich immer noch das Traceback: "NameError: global name 'api' is not defined".
Komisch...
BlackJack

@Floqqi: Ich fragte ja schon mal ob das auch der Code ist, der tatsächlich ausgeführt wird. Was machst Du denn nachdem Du den Quelltext verändert hast, damit der Webserver auch das *neue* Modul verwendet? Macht Pyramid das automatisch? Bis zu welchem Grad?
Floqqi

Pyramid startet nach jeder Veränderung bzw. nach jedem Speichern den Server neu. Bei Syntaxfehlern beendet sich der Server automatisch und lässt sich auch erst wieder nach Entfernen dieser neu starten.
Und dass der neue Code ausgeführt wird, bin ich mir auch sicher, das kann ich den Fehlermeldungen entnehmen. Da jetzt nicht mehr "api = ..." sondern "hanswurst = ..." in dem Traceback steht.
BlackJack

@Floqqi: Wenn da immer noch `api` als nicht definiert angemeckert wird, dann wird der neue Quelltext nicht ausgeführt. Das er im Traceback steht hat nichts zu bedeuten, denn die Quelltextzeilen, die im Traceback stehen kommen aus der `*.py`-Datei zu dem Zeitpunkt wo die Ausnahme aufgetreten ist -- was ja nicht heissen muss, dass das auch der Code ist, der gerade ausgeführt wird.

Wenn da jetzt allerdings zweimal `hanswurst` im Traceback steht, dann kann das nicht sein, dass im Quelltext das steht was Du sagst.
Floqqi

So, alles nochmal neugestartet. Jetzt kanns gar nicht sein, dass noch alter Code ausgeführt wird. Und bei mir meckert er wieder rum, dass "api" nicht definiert wird. Und im Quelltext steht wirklich nur das, was ich gesagt habe...
BlackJack

@Floqqi: Dann wohnen in Deinem Rechner böse Geister. Da kann man nix machen.
Benutzeravatar
daemonTutorials
User
Beiträge: 171
Registriert: Sonntag 6. Februar 2011, 12:06
Kontaktdaten:

Vielleicht mal:

Code: Alles auswählen

from tweepy.auth import OAuthHandler as twAuth
from tweepy.api import API as twAPI

auth = twAuth.OAuthHandler("XXX", "XXX", "http://XXX")

api = twAPI.API(auth_handler=auth)
api.update_status("test123")
 

Vielleicht hat tweepy ja Probleme damit, über die Py2.7.1 Methode angesprochen zu werden.
Wenn das nicht klappt, dann liegt es entweder an tweepy selbst, oder der Webserver hat Probleme mit Python.[Wenn Pyramid der Webserver ist, nehme ich den letzten Kommentar weg]
Zuletzt geändert von daemonTutorials am Mittwoch 9. Februar 2011, 20:59, insgesamt 1-mal geändert.
LG Maik
BlackJack

@daemonTutorials: Was soll das denn bitte bringen?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

BlackJack hat geschrieben:@daemonTutorials: Was soll das denn bitte bringen?
Einen ``SyntaxError``.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
daemonTutorials
User
Beiträge: 171
Registriert: Sonntag 6. Februar 2011, 12:06
Kontaktdaten:

Ich kann Py2.7.1 Scripte unter Python3 mit Einschränkungen laufen lassen!
Also dachte ich das geht auch anders herum!
LG Maik
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

daemonTutorials hat geschrieben:Ich kann Py2.7.1 Scripte unter Python3 mit Einschränkungen laufen lassen!

Code: Alles auswählen

from tweepy.api import API aus twAPI
ist in keiner jemals releasten Version gültige Syntax gewesen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
lunar

@daemonTutorials: Weniger denken, und mehr wissen ...
Antworten