Attribute Error beim Importieren

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
TheNew3000
User
Beiträge: 8
Registriert: Montag 3. März 2014, 15:35

Hallo,
Ich habe letztens beim Ausführen meines Codes folgenden Fehler bekommen:

Code: Alles auswählen

Traceback (most recent call last):
  File "Analyze.py", line 48, in <module>
    starten()
  File "Analyze.py", line 4, in starten
    import ipscanner
  File "/home/luca/Projekte/Werkzeug_01/ipscanner.py", line 3, in <module>
    import main
  File "/home/luca/Projekte/Werkzeug_01/main.py", line 37, in <module>
    main()
  File "/home/luca/Projekte/Werkzeug_01/main.py", line 18, in main
    import Analyze
  File "/home/luca/Projekte/Werkzeug_01/Analyze.py", line 48, in <module>
    starten()
  File "/home/luca/Projekte/Werkzeug_01/Analyze.py", line 33, in starten
    ipscanner.run(dstip,ttl)
AttributeError: 'module' object has no attribute 'run'
Ich habe schon gegoogelt,jedoch habe ich den Fehler nur in Verbindung mit classes gesehen,und ich benutze keine in meinem Code.
Hier ist der Code von Analyze.py:

Code: Alles auswählen

from termcolor import colored

def starten():
	import ipscanner
	import portscanner
	import traceroute
        import main
	dstip = "192.168.2.100"
	dport = "80"
	ttl = 64
	method = "all"
	while True:
		eing = raw_input(">>> " + colored("Analyze() ","red"))
		eing = eing.split()
		if eing[0] in ["goto"]:
			if eing[1] in ["ipscanner"]:
				import ipscanner
				ipscanner.start()
			elif eing[1] in ["portscanner"]:
				import portscanner
				portscanner.start()
			elif eing[1] in ["traceroute","tracert"]:
				import traceroute
				traceroute.start()
		elif eing[0] in ["show"]:
			if eing[1] in ["options"]:
				print colored("####[Analyze]####","red")
				print "    Destination: ",dstip
				print "          dPort: ",dport
				print "            TTL: ",ttl
				print "         Method: ",method
		elif eing[0] in ["run"]:
			print colored("##### IP-Ping #####","red") + "\n"
			ipscanner.run(dstip,ttl)
			print "\n"
			print colored("##### Portscan #####","red") + "\n"
			portscanner.run(method,dport,dstip)
			print "\n"
			print colored("##### Tracert #####","red") + "\n"
			traceroute.run(dstip)
			print "\n"
			print colored("######## Ende ########","blue") + "\n"			
		elif eing[0] == "end":
			main.main()
		elif eing[0] == "exit":
			exit()
def start():
	starten()
starten()
In main.py kann ich eigentlich nur in die anderen "wechseln",liegt es vielleicht daran das ich so viel importiere?

LG,
TheNew3000
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@TheNew3000: Module sind in Python auch Objekte. Wenn Du also »ipscanner.run« verwendest, wird nach dem Attribut »run« im Modul »ipscanner« gesucht. Heißt nichts anderes, als dass es in ipscanner keine Funktion »run« gibt. Importe sollten alle am Anfange einer Datei stehen und nicht innerhalb von Funktionen, dann weiß man sofort, von was dieses Modul alles abhängt. Module sollten übrigens ohne unerwartete Nebeneffekte importierbar sein, das »starten()« gehört also nicht ins Modul »Analyse«.
Zuletzt geändert von Sirius3 am Sonntag 23. März 2014, 12:04, insgesamt 1-mal geändert.
BlackJack

@TheNew3000: Ja ich würde mal auf die Importe tippen. `Analyze` importiert `ipscanner`, `ipscanner` importiert `main` und `main` importiert dann wieder `Analyze`. Solche zyklischen Importe sind eine ganz schlechte Idee, denn selbst wenn man sich mit dem Import-Mechanismus auskennt und abschätzen kann was da wann ausgeführt wird, ist das alles nur verworren und fehleranfällig.

Bei den Modulen sollte eine Hierarchie bestehen, wo Module aus höheren Ebenen solche in niedrigeren importieren, aber nicht umgekehrt. Wenn zwei Module sich direkt oder indirekt gegenseitig importieren, dann sind die Inhalte ganz offensichtlich nicht so stark getrennt, dass es Sinn macht sie in zwei Module aufzuteilen. Oder der Code ist einfach falsch aufgeteilt.

``import``-Anweisungen stehen in der Regel oben im Modul und nicht in Funktionen versteckt. Zusätzlich importierst Du Module die am Anfang der gezeigten Funktion importiert werden, mitten in der Funktion *noch mal*. Das hat keinerlei Effekt, ausser die Leser des Quelltext zu verwirren.

Da aus dem Modul `main.main()` aufgerufen wird, lässt einen weiteres Entwurfsproblem vermuten, denn wenn die `main()` auch die `starten()`-Funktion in diesem Modul direkt oder indirekt aufruft, dann hast Du eine Endlosrekursion, die irgendwann zum Programmabruch führt, weil die maximale Rekursionstiefe erreicht wurde.
Antworten