TypeError: 'module' object is not callable

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
drnicolas
User
Beiträge: 85
Registriert: Sonntag 24. Juli 2016, 10:32

Ich muss mich als Python-ANfänger bezeichnen.

Ich habe begonnen, ein Python-Programm zu schreiben, welches in mehrern Schritten Dateien bearbeitet/manipuliert.

Zuerst hatte ich für jeden Schritt ein eigenes Python-Programm mit eigener Kommandozeilenauswertung usw.
DIe Idee war, vom Haupt-Skript aus, die einzelnen Tools aufzurufen.

Jetzt habe ich gelesen, daß von dieser Vorgehensweise abgeraten wird.
Man solle stattdessen die einzelnen QUelldateien zu einem Package dazutun und dann vom Hauptprogramm aus die jeweilige Funktion aufrufen.

Und daran hapert es:
So rufe ich die Funtkion auf:

Code: Alles auswählen

_ret=SpiltTIFF(tmpdir,src)
Zuvor wurde ...

Code: Alles auswählen

import SplitTIFF
im Hauptprogramm ausgeführt.


In einer zweiten .py-Datei befindet sich die Funktion:

Code: Alles auswählen

def SplitTIFF(_tmpdir,_src):
....

Ich mache da wohl grundlegend was falsch

Nico
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Ganz klar ist es aus der Beschreibung nicht (und ich gehe davon aus, dass "SpiltTIFF" einfach ein Schreibfehler im Forum ist), aber ich vermute, dass du ein Modul SplitTIFF hast, das eine gleichnamige Funktion SplitTIFF beinhaltet. Aktuell importierst du das Modul und versuchst es als Funktion aufzurufen. Du musst aber die Funktion selber verwenden.

Also entweder

Code: Alles auswählen

import SplitTIFF

return = SplitTIFF.SplitTIFF(tmpdir, src)
oder

Code: Alles auswählen

from SplitTiff import SplitTIFF

return = SplitTIFF(tmpdir, src)
Und bitte keinen falschen Eindruck bekommen. Weder müssen Modulname und Funktionsname identisch sein, noch darf ein Modul nur eine einzige Funktion beinhalten.

Bezugnehmend auf den Style Guide for Python Code sollten Modul- und Funktionsnamen übrigens in Kleinbuchstaben mit trennenden Unterstrichen geschrieben werden.
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Und wo wir bei Namen sind: ein führender Unterstrich bei einem lokalen Namen (gilt auch für Argumente) kennzeichnet normalerweise Namen die nicht verwendet werden, aber aus irgendwelchen Gründen vorhanden sein müssen. Zum Beispiel beim „tuple unpacking“ oder in Argumentlisten weil der Aufrufer etwas übergibt was man in der Funktion/Methode dann aber gar nicht braucht. ``_ret = …`` ist also etwas komisch, weil man das dann auch einfach weglassen könnte. Zudem ist der Name selbst auch nicht zu besonders, weil es sich anscheinend um eine Abkürzung handelt‽

Edit: Ich habe jetzt erst die führenden Unterstriche bei den Argumenten bei der Definition von der `SplitTIFF()`-Funktion gesehen: Das ist ziemlich sicher falsch!
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
KevKev
User
Beiträge: 5
Registriert: Montag 18. Februar 2019, 17:45

Hallo zusammen

Ich versuche auch mein eigenes Programm zu schreiben. Leider bekomme ich de selbe Fehlermeldung. Versuche nun schon seit längerem auf eine Lösung zu kommen, nur leider stehe ich voll auf dem Schlauch und schaffe es einfach nicht. Hoffe jemand hier kann mir helfen.

Mein Code:

Code: Alles auswählen

import json
import os

togr650 = {}
togr550 = {}
togr450 = {}
tod650 = {}
tod550 = {}
tod450 = {}

dict_names = ("to_gr_650.json", "to_gr_550.json","to_gr_450.json", "to_d_650.json", "to_d_550.json", "to_d_450.json")
as_names = (os.path("gr650"), os.path("gr550"), os.path("gr450"), os.path("d650"), os.path("d550"), os.path("d450"))
dicts = (togr650, togr550, togr450, tod650, tod550, tod450)

def fix_floats(data):
    if isinstance(data,list):
        iterator = enumerate(data)
    elif isinstance(data,dict):
        iterator = data.items()
    else:
        raise TypeError("can only traverse list or dict")

    for i,value in iterator:
        if isinstance(value,(list,dict)):
            fix_floats(value)
        elif isinstance(value,str):
            try:
                data[i] = float(value)
            except ValueError:
                pass

for num, d in enumerate(zip(dict_names),1): 
    for num, a in enumerate(zip(as_names),1):
        for num, d2 in enumerate(zip(dicts),1):
             with open(d, "r") as a:
                 d2 = fix_floats(json.load(a))
                 print(d2)
Die Fehlermeldung sieht wie folgt aus:

Code: Alles auswählen

Traceback (most recent call last):

  File "<ipython-input-15-747a58840eb2>", line 1, in <module>
    runfile('C:/Users/***/Desktop/Python Tecnam Projekt/untitled1.py', wdir='C:/Users***/Desktop/Python Tecnam Projekt')

  File "C:\Users\***\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 827, in runfile
    execfile(filename, namespace)

  File "C:\Users***\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 110, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "C:/Users/***/Desktop/Python Tecnam Projekt/untitled1.py", line 21, in <module>
    as_names = (os.path("gr650"), os.path("gr550"), os.path("gr450"), os.path("d650"), os.path("d550"), os.path("d450"))

TypeError: 'module' object is not callable
Vielen Dank schon jetzt für eure Hilfe.

LG Kevin
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Erkläre mal was so etwas wie `os.path("gr650")` bedeuten soll und wo in der Python-Dokumentation zu `os` oder `os.path` Du den Eindruck gewonnen hast, dass es das bedeutet was Du denkst.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@KevKev: Was glaubst Du, bewirkt `os.path("gr650")`?
Und was denkst Du, tun die drei verschachtelten for-Schleifen?
`num` wird nirgends benutzt, ebensowenig die Laufvariablen `a` oder `d2` der inneren for-Schleifen.
Antworten