Seite 1 von 1

'module' object has no attribute 'rechne'

Verfasst: Samstag 19. Dezember 2009, 03:57
von T-Bone
Das ist mir schon fast peinlich das ich das hier fragen muss ...

Ich probiere grad mit Websockets rum und wollt nun was einfaches probieren.

Ich habe folgende zwei Codes:

mathe.py

Code: Alles auswählen


from mod_pywebsocket import msgutil
import rechnen

def web_socket_do_extra_handshake(request):
    pass  # Always accept.


def web_socket_transfer_data(request):
    while True:
        line = msgutil.receive_message(request)

        e = rechnen.rechne('1+2')
           
           
        msgutil.send_message(request, e)
     
       return       

und rechnen.py

Code: Alles auswählen

def rechne(line):

    zahlen = line.split('+')

    ergebnis = zahlen[0] + zahlen[1]    
    return ergebnis


(so wird wohl in Python nicht gerechnet aber es ergibt ein Ergebnis)

mathe.py ist die Datei die angesteuert wird aus der HTML Seite was auch funktioniert.

Öffne ich pythonw.exe (dafür gibt es doch sicher einen Begriff oder?) und öffne daraus die Datei mathe.py und drücke F5 und gebe dann rechnen.rechne('1+2') ein erhalte ich als Ergebnis 12

Steuer ich jedoch mathe.py aus der HTML Datei an erhalte ich in der Konsole den Fehler (ich muss für die Websockets in der Konsole eine Datei standalone.py aufrufen die Fehler zurück gibt)

'module' object has no attribute 'rechne'

Geb ich in mathe.py e den Wert 'du' erhalte ich im Browser auch "du" als Ausgabe also scheint er rechnen.rechne nicht schlucken zu wollen.


Nicht bös sein , ich bin totaler Anfänger in Python und ich bemühe mich
selbstverständlich meine Probleme selbst mit Google zu lösen aber
das hab ich jetzt die letzten 2 Stunden nicht geschafft.

Guten Morgen wünsch ich.

Verfasst: Samstag 19. Dezember 2009, 08:21
von numerix
Ebenfalls "'Guten Morgen".

Dass er nicht "rechnet" liegt daran, dass du nicht zwei Zahlenwerte, sondern zwei Zeichenketten mittels "+" verknüpfst: Deine Funktion rechne() zerlegt eine Zeichenkette der Form "<a>+<b>" zunächst in "<a>" und "<b>" um sie anschließend ohne das "+" wieder zusammenzusetzen ...

Für eine anständige Lösung (und damit meine ich jetzt nicht einfach "funktionierende Lösung", denn da gibt es noch eine quick'n dirty Lösung, die ich aus gutem Grund nicht angeben werde) müsstest du die Zeichenketten zuvor in Zahlenwert umwandeln.

Was deine 2 Stunden mit google angeht. Ich empfehle stattdessen mit dem Durcharbeiten des Tutorials zu beginnen. Das dauert zwar länger als 2 Stunden, führt aber auf jeden Fall zu Erfolgen: http://tutorial.pocoo.org/

Verfasst: Samstag 19. Dezember 2009, 10:57
von sma

Code: Alles auswählen

def rechne(s):
	return sum(map(int, s.split("+")))

print rechne("1+2+3+4")
Stefan

Verfasst: Samstag 19. Dezember 2009, 11:52
von T-Bone
Hey danke für die Antworten und die Beispiellösung.
Die Beispiellösung funktioniert wenn ich pythonw.exe -> öffnen -> mathe.py -> F5 und dann rechnen.rechne('1+5') eintippe krieg ich 6 raus aber

ich hab immernmoch das Problem das ich folgenden Fehler kriege wenn ich
die Datei mathe.py aus der HTML Datei ansteuer:

[WARNING] root: mod_pywebsocket: web_socket_transfer_data raised exception for /mathe: 'module' object has no attribute 'rechne'

Mir geht es auch eigentlich erstmal nicht ums rechnen sondern überhaupt um eine Ausgabe.

Ich habe auch nicht gemeint das ich Stunden suchte nach der Lösung fürs rechnen sondern um die rechnen.py per import einzubinden und dann die Funktion rechnen.rechne benutzen zu können in mathe.py

Ist doch richtig so oder nicht?

Code: Alles auswählen

import rechnen.py

...

e = rechnen.rechne('1+5')
Das Tutorial werd ich mir nun auch mal angucken, danke für den Link

Verfasst: Samstag 19. Dezember 2009, 12:21
von EyDu
T-Bone hat geschrieben:Ist doch richtig so oder nicht?

Code: Alles auswählen

import rechnen.py

...

e = rechnen.rechne('1+5')
Das Tutorial werd ich mir nun auch mal angucken, danke für den Link
Nein, ist es nicht ;-) Im Tutorial steht drin, wie man Module importiert.

Verfasst: Samstag 19. Dezember 2009, 12:43
von T-Bone
Ups, hab beim telefonieren statt import rechnen , import rechnen.py eingegeben und das weiss ich das das so nicht richtig ist.

Da steht
Ein Modul ist eine Datei, die Python-Definitionen und -Anweisungen beinhaltet. Der Dateiname mit dem .py-Suffix entspricht dem Namen des Moduls.
also ist der Modulname , wenn ich

Code: Alles auswählen

import rechnen 
eingebe , rechnen , richtig?
Dieser Befehl fügt die von fibo.py definierten Funktionen nicht automatisch in die globale Symboltabelle (symbol table) ein, sondern nur den Modulnamen fibo. Um die Funktionen anzusprechen, benutzt man den Modulnamen:


>>> fibo.fib(1000)
macht doch dann bei mir rechnen.rechne('1+5')
oder nicht?

Ich seh das leider nicht anders ...

Quelle: http://tutorial.pocoo.org/modules.html

Verfasst: Montag 21. Dezember 2009, 14:51
von T-Bone
Mag mir denn keiner bei diesem, wohl sehr kleinen, Problem helfen?
Ich hab es ,so peinlich es auch ist, nicht hinbekommen.

Ich möcht doch nur schön alles von einander trennen...
So einen schlechten Start hat ich noch nie in einer Sprache.

Helft mir doch bitte :?

Verfasst: Montag 21. Dezember 2009, 17:05
von BlackJack
@T-Bone: Wie sieht das Problem denn jetzt *genau* aus?

Verfasst: Montag 21. Dezember 2009, 19:02
von T-Bone
Also ich hab jetzt einmal mathe_wsh.py

Code: Alles auswählen

from mod_pywebsocket import msgutil
import rechnen



def web_socket_do_extra_handshake(request):
    pass  # Always accept.


def web_socket_transfer_data(request):
    while True:
        line = msgutil.receive_message(request)

        e = rechnen.rechne(line)

        e = str(e)

           
        msgutil.send_message(request,e)
        if line == _GOODBYE_MESSAGE:
            return       
        


und will die Datei rechnen.py importieren.
Diese Datei befindet sich im selben Ordner wie mathe_wsh.py.

Steuer ich dann mathe_wsh.py aus der HTML Datei an dann wird mir in der Konsole

[WARNING] root: mod_pywebsocket: web_socket_transfer_data raised exception for /mathe: 'module' object has no attribute 'rechne'

ausgespuckt.


Was ich nun mal probiert habe, was auch funktioniert, ist das ich die Datei in den Ordner ...\python24\Lib\site-packages\mod_pywebsocket gepackt habe und dann in mathe_wsh.py

Code: Alles auswählen

from mod_pywebsocket import rechnen
angegeben habe.
Das geht ist aber nicht gewollt. Ich würde schon gerne die Scripte von mehreren Projekten getrennt aufbewahren können.

Wird denn nicht im selben Verzeichnis wo das ausgeführte Script sich befindet gesucht ?

Ich denke doch denn wenn ich pythonw.exe starten, mathe_wsh.py öffne und F5 drücke und dann rechnen.rechne('1+1') eingebe wird 2 angezeigt.

Deswegen versteh ich auch nicht warum es denn nicht geht wenn ich aus meiner HTML Datei mathe_wsh.py ansteuer.

Verfasst: Montag 21. Dezember 2009, 19:06
von Defnull
Liegt sonst noch irgendwo ne 'rennen.py' rum, die aus versehen statt der richtigen importiert wird?

Verfasst: Montag 21. Dezember 2009, 19:24
von T-Bone
Nein, die Datei gibt es nur 2 mal und es ist exakt die selbe.

Einmal im selben Ordner wie mathe_wsh.py

und dann nun nochmal im
Python Order .../site-packages/mod_pywebsocket also
da wo mod_pywebsocket installiert ist
und mit

from mod_pywebsocket import rechnen

wird dann aus dem ../site-packages/mod_pywebsocket die Datei rechnen.py geladen , nehm die die nämlich da raus geht es auch nicht mehr.

Edit:
Problem endlich gelöst.

Ich hab im site-packages Ordner eine datei mit der Endung pth erstellt und dort den Pfad angegeben in dem math.py und rechnen.py liegen.
Der Name von der pth Datei ist egal.

Wenn eine pth Datei vorhanden ist soll man diese erweitern.
Hab ich bei Google gefunden.

Sollte vielleicht nicht so sein aber es geht und das ist mir wichtig.

Verfasst: Dienstag 22. Dezember 2009, 09:29
von Darii
Wäre schön, wenn solche Informationen(dass du versuchst hast irgendwelche Pfade zu verbiegen) mal gleich gekommen wären. Dann hätte man dir auch helfen können. Vermutlich hätte sich das Problem einfach dadurch lösen lassen, dass du den ganzen-Site-Packages-Kram weglässt nur nur die Datei in deinem Programmordner lässt(btw. es gibt nicht noch zufällig irgendwelche Ordner die rechnen heißen?).

Verfasst: Dienstag 22. Dezember 2009, 11:10
von T-Bone
Darii hat geschrieben:Wäre schön, wenn solche Informationen(dass du versuchst hast irgendwelche Pfade zu verbiegen) mal gleich gekommen wären.
Wo hab ich denn vorgehabt "Pfade zu verbiegen"?

Es gab rechnen.py nur einmal , im selben Order wie mathe.py.
Es gab die Datei nur ein einziges mal auf dem PC.
Es gibt keinen anderen Ordner der rechnen heisst auf dem PC.

Weil es trotz dieser umständen nicht funktioniert hat habe ich dann

rechnen.py in den site-packages Ordner kopiert.
Es dann mit

from mod_pywebsocket import rechnen

probiert damit ich rausfinde ob das geht und dann festgestellt das es geht.

Hab ich aber doch auch alles schon geschrieben.
Ich seh dein Problem nicht.

Verfasst: Dienstag 22. Dezember 2009, 12:15
von mkesper
Du versuchst immer noch, den zweiten Schritt vor dem ersten zu machen. Meine Empfehlung: Alles nochmal neu installieren und dann das Tutorial durcharbeiten, bevor du dich an wsgi ausprobierst.

Verfasst: Dienstag 22. Dezember 2009, 13:16
von Darii
T-Bone hat geschrieben:Ich seh dein Problem nicht.
Eben hast du noch von 2 Dateien gesprochen, jetzt ist es wieder eine? Aus deinem vorletzten Post ist wirklich nicht zu ersehen, wie genau du vorgegangen ist.

Deiner Problembeschreibung zufolge müsste das, was du versucht, eigentlich funktionieren. Da es das nicht tut, ist anzunehmen, dass noch irgendeine wichtige Information fehlt.

Verfasst: Dienstag 22. Dezember 2009, 14:46
von T-Bone
Ich kanns nicht besser erklären und ich finde es auch verständlich (wär ja auch schlimm wenn nicht :D )

Ich habe ja mittlerweile eine Lösung gefunden und sie genannt.
Mir ist nun egal warum es ohne die pth Datei nicht funktioniert , hauptsache es funktioniert jetzt.


Bei einem erneuten Problem werde ich versuchen es konkreter zu beschreiben.
Vielen Dank für die Hilfe , ohne hätte ich warcheinlich schon aufgegeben.
Dann arbeite ich mal weiter


:)