Zum Inhalt springen
  • 0

Scripte laufen nach Umstellung nicht mehr


DeepDown

Frage

Hallo,

ich habe ein sehr langes Pyhtonscript welches ich nun begonnen habe in Klassen und Methoden zu struktureren. Dabei treten aber sehr merkwürdige Fehler auf, ich kann kein Python und bin immer froh wenn ich eine Zeile geschrieben habe ohne dass die IDE meckert. Es geht hier nicht um den Inhalt der Datei, sondern um die Fehlermeldung die ich bekomme wenn ich die Datei insertData.py aufrufe kommt es zur Fehlermeldung  

D

  File "C:\pycharm_dev\test\notify2.0\insertData.py", line 17, in <module>
    softwareList = CsvImport.import_csv()
AttributeError: module 'CsvImport' has no attribute 'import_csv'

Obwohl es eine Methode mit dem Namen in der Datei gibt. Eine andere Version der Datei ist noch schlimmer . Es exisitiert eine Tabelle software, und solange das alles in einem Spaghetticode war lief es auch, plötzlich soll es die Software-Objekte nicht mehr geben ? Ich denke dass ich da (wie gesagt die Sprache ist mir nicht bekannt, wobei ich mir die Sachen dann aus anderen Sprachen zusammenreime. Aber wieso will er die Tabelle software bzw. software.productName plötzlich nicht mehr kennen ?

 def getStatusData(self):
        session = Session(engine)
        statusFieldNames = ['name', 'date', 'time', 'oldVersion', 'currentVersion']
        delimiter =';'
        statusList = csvImport('data/notify_mail_sorted.txt',statusFieldNames,';')
        locale.setlocale(locale.LC_ALL,'en_US') ## zum Einlesen des Formats '1 Jan 2020'
        lastID = 0
        statTemp = ''
        lastDate = datetime.strptime('1 Jul 2000 00:00:00', '%d %b %Y %H:%M:%S')  ## Anfangsdatum für Vergleich
        for stDicts in statusList:
            qry = select(software).where(software.productName == stDicts['name'])
            res= session.execute(qry)

Ich brauche das dringend für ein Projekt, habe aber keine Lehrer oder Verantwortlichen, die Sprache selbst ist mir fremd. Wie behebe ich dieses beiden Fehler ? Es gibt noch etliche andere aber ich werde dann versuchen ein anderes Fourm zu Rate zu ziehen, aber wenn ich diese beiden Fehler weg hätte wäre es schonmal ein Anfang. Hilfe würde ich sehr schätzen

createTables.py CsvImport.py Data.py ignore.py insertData.py pyvenv.cfg testing.sqlite

Link zu diesem Kommentar
Auf anderen Seiten teilen

7 Antworten auf diese Frage

Empfohlene Beiträge

  • 0

Uh sorry, ich sollte vielleicht besser posten und anschliessend schlafen habs gleichzeitig versucht. Ich hatte den Namen ein paarmal geändert weil ich nicht so ganz verstehe wie eine Klasse einen anderen Namen haben kann als die Datei in der sie sich befindet. Die Version die (auch nicht) lief sah so aus:

class CsvImport:

    def import_csv(self,URI,fields,delimiter):
        if(fields=="" and delimiter==""):
            with open(URI, 'r',newline='') as csvFile:
                dictReader = DictReader(csvFile)
            listOfContent = list(dictReader)
            return listOfContent
        else:
            with open(URI, 'r') as csvFile:
                dictReader = DictReader(csvFile, fieldnames=fields, delimiter=delimiter)
            listOfContent = list(dictReader)
        return listOfContent

Das Problem ist wie gesagt dass das Ganze mal ein einziges Script war, und ich es nun in Klassen und Methoden zerlegen muss, und die Datei liefert leider keine Liste zurück, ich habe auch schon versucht zu debuggen, habe aber keinen Breakpoint setzen können an dem das script angehalten hätte

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0

Ich kenne mich jetzt nich mit Python aus aber könnte es hieran liegen?

vor 9 Stunden schrieb DeepDown:
statusList = csvImport('data/notify_mail_sorted.txt',statusFieldNames,';')

Hier rufst du die Funktion mit 3 Übergabeparametern auf.

vor 8 Minuten schrieb DeepDown:
 def import_csv(self,URI,fields,delimiter):

Hier ist sie allerdings mit 4 Übergabeparametern definiert.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0

Geht es hier um dein Abschlussprojekt

 

vor 10 Stunden schrieb DeepDown:

Es geht hier nicht um den Inhalt der Datei, sondern um die Fehlermeldung die ich bekomme wenn ich die Datei insertData.py aufrufe kommt es zur Fehlermeldung  

  File "C:\pycharm_dev\test\notify2.0\insertData.py", line 17, in <module>
    softwareList = CsvImport.import_csv()
AttributeError: module 'CsvImport' has no attribute 'import_csv'

Obwohl es eine Methode mit dem Namen in der Datei gibt.

Hierzu kann ich nur folgendes sagen:

Du rufst die Funktion import_csv() aus der Datei CsvImport auf.
Diese existiert zwar darin, allerdings ist sie nochmal in einer Klasse CsvImporter drin.
Wäre sie dort im global scope, könntest du sie einfach aufrufen.

Hier mal ein kleines Beispiel, was funktioniert:

#Datei testen.py

import testPy

print(testPy.summieren(1,2))

---------------------------------------

#Datei testPy.py

def summieren(a,b):
    return a+b

Hier wird die Funktion aus der anderen Datei aufgerufen und a+b korrekt returned.

Sieht die Datei testPy.py jedoch so aus:

class testKlasse:
    def testSummieren(a,b):
        return a+b

müsste der Aufruf so lauten: print(testPy.testKlasse.testSummieren(1,2))

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
vor 7 Stunden schrieb Brapchu:

Ich kenne mich jetzt nich mit Python aus aber könnte es hieran liegen?

Hier rufst du die Funktion mit 3 Übergabeparametern auf.

Hier ist sie allerdings mit 4 Übergabeparametern definiert.

Ja ich kenne mich auch nicht besonders in Python aus, es ist aber wohl so dass jeder Funktion die in einer Klasse definiert wird immer den 'self' -Parameter in der Definition haben muss, obwohl er dann bei der Nutzung des Funktion gar nicht übergeben muss. Python hat einige Besonderheiten und es war auch nicht meine Wahl.

 

vor 5 Stunden schrieb samuelz00:

Vorweg - ich bin euch unendlich dankbar für eute Hilfe, ich bin nicht mehr weit vom Verzweifeln entfernt und bin froh dass ihr euch die Mühe macht in eurer Freizeit einer älteren Schachtel zu helfen (oder heisst es nun alte Schachtelinnen ? ). Ich halte es nicht für selbstverständlich, und wäre ohne Hilfe vermutlich zu überhaupt nix in der Lage...

 

Geht es hier um dein Abschlussprojekt

😰 Schluchz - ja leider. Als Hintergrund, ich habe vor knapp 5 Jahren mit recht genau 40 Jahren eine Umschulung begonnen, die ich kurz vor Projektpräsentation dank eines ver.... Schaglaganfalls unterbrechen musste, und es hat nicht nur Jahre gedauert überhaupt wieder fit genug zu werden, das Amt hat mich aber nicht nehr unterstützt was bedeutet ich konnte ein kostenfreies Praktikum nur in einer gemeinnützigen Einrichtung machen, und als ich oh Wunder tatsächlich etwas fand kam Corona und das Institut wurde weitgehend geschlossen.  Also hatte ich nur die Möglichkeit einmal die Woche per Webmeeting Fragen zu stellen. Der erste Hammer war das mir Python vorgeschrieben wurde (obwohl auch die beiden Ansprechpartner im Insitut es nicht können), das letzte Projekt war in Java geschrieben, dazwischen über 4 Jahre Pause.

Der eigentliche Klopfer war dann aber dass meine zuständige IHK Frau im Mutterschaftsurlaub ist und mir die Vertretung die Frist nach hinten um ein halbes Jahr kürzte, da sich die Prüfungsordnungen geändert haben. Die Arbeit mit meinem Ansprechpartner im Institut hat sich als sehr kompliziert erwiesen, auch in Foren hatte ich um Hilfe gebeten, ich hatte da nicht im Sinn dass mir ein anderer die Arbeit schreibt, nur der Wunsch mich nicht gleich mit irgednwelchen Dummen Fehlern zu blamieren. Nun habe ich noch eine Woche Zeit, da ich nur diese eine Chance habe versuche ich mich da irgendwie durchzubeissen. Das nur als Hintergrundinfo wenn das Ganze etwas schräg erscheint.

Zum Inhalt - ist die Funktion im Prinzip statisch (was hier auch Sinn machen würde, ich bekomme eine Liste die von der Klasse dictReader erzeugt wird, da ist es ja auch nicht nötig denke ich mir dass man die Klasse instanziiert, aber gehen würde es

## testen.py

import testPy
testing = testPy
out = testing.summieren(5,6)
print(testPy.summieren(1,2))
print(out)

>> 3
>> 11

Ich bekomme es nur leider absolut nicht hin die Import Klasse richtig zu instanziieren, es führt immer wieder zu den Fehlern:

Ich habe sicherheitshalber die ganze Datei eingebunden

import CsvImport

software = createTables.software
software_status = createTables.software_status
createTables.createTables()
session = Session(createTables.engine)

importer = CsvImport()
importer.import_csv()

mit importer wird ja eine Instanz der Klasse gebildet, die dann doch auf die eigenen Methoden zugreifen können sollte - jedoch heisst es dann

  File "C:\pycharm_dev\test\notify2.0\insertData.py", line 18, in <module>
    importer = CsvImport()
TypeError: 'module' object is not callable

oder auch

AttributeError: module 'CsvImport' has no attribute 'import_csv'

wenn ich es so versuche

 importer = CsvImport.import_csv()

Gibt es denn keine Möglichkeit dass man, wie in anderen Sprachen, eine Instanz bildet (die etwa dem Muster JackDaniels = new Whiskey() folgt ?

 

vor 5 Stunden schrieb samuelz00:

Ein zweites Problem geht in dieselbe Richtung, durch das Framework SQLAlchemy wird das ganze ORM - gedöns automatisch vorgenommen, die Datei dazu sieht so aus:

class createDatabase:
    def createDb(self):
        session = Session(engine)
        software = createTables.software
        software_status = createTables.software_status
        createTables.createTables()

        fields=''
        delimiter=''
        softwareList = csvImport('data/software.csv',fields,delimiter)

        for dicts in softwareList:
            sw = createTables.software(id=dicts['SoftwareID'],productName=dicts['ProductID'])
            session.add(sw)
        session.commit()

Nun habe ich aber das Problem dass ich in einer zweiten Funktion queries auf den Tabellen durchführen muss, er die Tabellen software und software_status nicht kennt, zB

 for stDicts in statusList:
            qry = select(software).where(software.productName == stDicts['name'])

wobei software beidemale schon unterkringelt ist. Wie mache ich die Namen der Tabellen den anderen Klassen  bekannst ?

Hierzu kann ich nur folgendes sagen:

Du rufst die Funktion import_csv() aus der Datei CsvImport auf.
Diese existiert zwar darin, allerdings ist sie nochmal in einer Klasse CsvImporter drin.
Wäre sie dort im global scope, könntest du sie einfach aufrufen.

Hier mal ein kleines Beispiel, was funktioniert:

#Datei testen.py

import testPy

print(testPy.summieren(1,2))

---------------------------------------

#Datei testPy.py

def summieren(a,b):
    return a+b

Hier wird die Funktion aus der anderen Datei aufgerufen und a+b korrekt returned.

Sieht die Datei testPy.py jedoch so aus:

class testKlasse:
    def testSummieren(a,b):
        return a+b

müsste der Aufruf so lauten: print(testPy.testKlasse.testSummieren(1,2))

Du  hast natürlich recht, entweder ich rufe eine Instanz auf oder behandele die Funktion als statisch, aber meine Hauptsprachen wie Java oder C# erwarten dann dass eine Methode auch als static gekennzeichnet wird. In diesem Beispiel könnte also die Klasse wie die

vor 5 Stunden schrieb samuelz00:

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0

Ich bin irgendwie nicht in der Lage meine Beiträge zu editieren, da ist viel Zitat im Beitrag der da eigentlich nicht rein sollte.

Daher nochmal in Kurzform. In einem Modul werden die Klassen definiert, die für SQLAlchemy als ORM - Vorlagefür Tabellen dienen. In einem anderen Modul sollen in verschiedenen Funktionen Abfragen auf die Tabellen erfolgen. Das Befüllen der ersten Tabelle läuft auch durch,

class fillTables:
    software = createTables.software
    software_status = createTables.software_status
    def fillSoftwareTable(self):
        createTables.createTables()
        fields=''
        delimiter=''
        softwareList = csvImport('data/software.csv',fields,delimiter)
        for dicts in softwareList:
            sw = createTables.software(id=dicts['SoftwareID'],productName=dicts['ProductID'])
            with Session(engine) as session:
                session.add(sw)
            session.commit()

. für die 2. Tabelle brauche ich aber ID's aus der ersten, und in dieser Funktion bekomme ich aber den Fehler, der Tabellenname wäre nicht definiert:

 for stDicts in statusList:
            qry = select(software).where(software.productName == stDicts['name'])
            with Session(engine) as session:
                res= session.execute(qry)

>> Traceback (most recent call last):
>>  File "C:\pycharm_dev\notify2.0bu\notify2.0b\notify2.0\insertData.py", line 80, in <module>
    filling.getStatusData()
  File "C:\pycharm_dev\notify2.0bu\notify2.0b\notify2.0\insertData.py", line 41, in getStatusData
    qry = select(software).where(software.productName == stDicts['name'])
>> NameError: name 'software' is not defined

Sollten die Tabellennamen nicht als Klassenattribute bekannt sein ? Ich habe auch versucht die Tabellennamen der Funktion zu übergeben, hat aber auch nicht funktioniert, wie mache ich das Tabellenobjekt in allen Funktionen verfügbar ?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Diese Frage beantworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...