Random IP

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.
Benutzeravatar
graphicsH
User
Beiträge: 84
Registriert: Donnerstag 8. September 2011, 10:21

Hi,
ich arbeite an einem Script der eine IP per Zufall erstellen soll,ich kriege jedoch immer nur 1-3 Zahlen heraus...

Code: Alles auswählen

def chip():
    part = int(4)        #IP=4teilig (von Punkten getrennnt)
    while(part>0):
        num = str(random.randint(0,9))       #erste Zahl der IP
        val = random.randint(0,2)               #wieviele Zahlen pro Part (1-3)
        while(val>0):
            num = num + str(random.randint(0,9))
            val -= 1
        if(part!=1):
            num = num + '.'        #damit am ende der IP kein punkt ist
        part -= 1
    print num
wo liegt der fehler?
ich bekomme immer nur 1-3 zahlen (=ersten part) geschrieben...
Zuletzt geändert von graphicsH am Dienstag 15. November 2011, 16:49, insgesamt 1-mal geändert.
-
Benutzeravatar
graphicsH
User
Beiträge: 84
Registriert: Donnerstag 8. September 2011, 10:21

random ist auch importiert....

Und könnte ich irgendwie die warscheinlichkeit von 3 Stellen erhöhen und 1 Stelle verringern?
-
deets

Oh. Mein. Gott.

Zuerstmal ist int(4) ist voelliger Unsinn. 4 ist ein int.

Dann schau dir mal an, was

".".join(["look", "ma", "it's", "working])

tut.

Und last but not least: Wenn du schon randint kennst, warum dann nicht randint(1, 254) pro Komponente?
Benutzeravatar
graphicsH
User
Beiträge: 84
Registriert: Donnerstag 8. September 2011, 10:21

warum dann nicht randint(1, 254) pro Komponente?
stimmt,voll vergessen...
-
Benutzeravatar
graphicsH
User
Beiträge: 84
Registriert: Donnerstag 8. September 2011, 10:21

so,abgeändert,krieg aber immer noch keine ganze IP + Gateway...

Code: Alles auswählen

import random

def getIP():
    part = int(4)
    while(part>0):
        num = str(random.randint(0,255))
        if(part!=1):
            num = num + '.'
        part -= 1
    chipIP = num
    print chipIP
def getGateWay():
    chipGW = str.split(chipIP,'.')
    def getPart():
        num = str(random.randint(0,255))
        global num
    global chipGW
    chipGW = chipGW[0] + '.' + chipGW[1] + '.' + chipGW[2] + '.' + num
    print chipGW
-
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

graphicsH hat geschrieben:so,abgeändert,krieg aber immer noch keine ganze IP + Gateway...
Ich werde aus dem absolut umständlichen, vermurksten und PEP-8-ignoranten Code nicht schlau. Kann es sein, dass du einfach so etwas möchtest?

Code: Alles auswählen

print '.'.join([str(random.randint(0, 255))for _ in xrange(4)])
Benutzeravatar
graphicsH
User
Beiträge: 84
Registriert: Donnerstag 8. September 2011, 10:21

@/me
quasi...

hab zu komplieziert gedacht...

thx
-
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Bitte guck dir mal das Python Tutorial an. Listen sollte man aufjedenfall mal durchgearbeitet haben. Am besten dann auch gleich Listcomprehensions. Mit denen ist es ein Einzeiler:

Code: Alles auswählen

from random import randint

def get_ip(parts=4):
    return ".".join(str(randint(0,255)) for x in xrange(parts))

print get_ip(9)
Ausgabe

Code: Alles auswählen

34.9.226.157.155.167.12.156.232
Grüße,
anogayales

Edit: War wohl jemand schneller :P
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

anogayales hat geschrieben:Edit: War wohl jemand schneller :P
Es ist aber schön zu sehen, dass man bei ähnlichen Lösungen landet.
Benutzeravatar
graphicsH
User
Beiträge: 84
Registriert: Donnerstag 8. September 2011, 10:21

@anogayales
hab mir schon viele Tutorials angeschaut (auch x über listen), join ist jedoch nie
vorgekommen...
Habs daher bisher nicht gekannt...
-
Benutzeravatar
graphicsH
User
Beiträge: 84
Registriert: Donnerstag 8. September 2011, 10:21

Hier schon nächstes problem:

(Ausschnitt meines CLI)

Code: Alles auswählen

    def do_chip(self,intervall):
        def getIP():
            global chipIP
            chipIP = '.'.join([str(random.randint(0, 255))for _ in xrange(4)])
    #.
    #.
    #.
    print chipIP #zum test
Error:
NameError: global name 'chipIP' is not defined
was ist falsch?oben definiert und 'globalisiert'...
-
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

graphicsH hat geschrieben:was ist falsch?oben definiert und 'globalisiert'...
Jetzt vergiss doch bitte endlich mal global. Damit schaffst du dir diverse unschönen Abhängigkeiten in deinem Code. Gib einfach den errechneten Wert aus der Funktion zurück.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

graphicsH hat geschrieben:hab mir schon viele Tutorials angeschaut (auch x über listen), join ist jedoch nie
vorgekommen...
Dann schau dir auch mal eine Beschreibung der Built-in Types an. Mit diesen Typen geht man häufiger um und man sollte zumindest eine Idee davon haben, was sie von Haus aus liefern.
Benutzeravatar
graphicsH
User
Beiträge: 84
Registriert: Donnerstag 8. September 2011, 10:21

Gib einfach den errechneten Wert aus der Funktion zurück.
den Befehl print in der funktion wiedergeben ist nutzlos,da ich dann statt print einen anderen Befehl (mit chipIP) in einer anderen Funktion benütze
-
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

graphicsH hat geschrieben:
Gib einfach den errechneten Wert aus der Funktion zurück.
den Befehl print in der funktion wiedergeben ist nutzlos,da ich dann statt print einen anderen Befehl (mit chipIP) in einer anderen Funktion benütze
Du hast laut deiner eigenen Aussage viele Tutorials durchgelesen und nach meiner Einschätzung kaum eins davon wirklich verstanden. Du weißt überhaupt nicht wovon ich rede, oder?

Sagt dir return etwas?

Lies im offiziellen Tutorial Defining Functions und verstehe das diesmal auch noch.
Benutzeravatar
graphicsH
User
Beiträge: 84
Registriert: Donnerstag 8. September 2011, 10:21

@/me
ja,es gibt den Wert einer Variable zurück.
-
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

graphicsH hat geschrieben:ja,es gibt den Wert einer Variable zurück.
Wofür brauchst du denn dann noch eine globale Variable? Du übernimmst den Rückgabewert und verwendest den weiter.

Code: Alles auswählen

def print_value(val):
    print val

def calculate_value(number):
    return 42 * number

result = calculate_value(23)
print_value(result)
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

graphicsH hat geschrieben:wo liegt der fehler?
Du überschreibst num jedes Mal in der 1. Zeile nach while.
Benutzeravatar
graphicsH
User
Beiträge: 84
Registriert: Donnerstag 8. September 2011, 10:21

irgendwas geht immer noch nicht...

(Ausschnitt CLI)

Code: Alles auswählen

    def do_chip(self,intervall):
        try:
            def getIP():
                chipIP = '.'.join([str(random.randint(0, 255))for _ in xrange(4)])
                return chipIP
            def getGateWay():
                chipGW = str.split(chipIP,'.')
                def getPart():
                    num = str(random.randint(0,255))
                chipGW = chipGW[0] + '.' + chipGW[1] + '.' + chipGW[2] + '.' + num
                return chipGW
            chipSM = '255.255.255.0'
            def changeThem(ip,gw):
                getIp()
                getGateWay()
                wmis = wmi.WMI().Win32_NetworkAdapterConfiguration(IPEnabled=True)
                wmis = wmis[0]
                wmis.EnableStatic(IPAdress=[chipIP],SubnetMask=[chipSM])
                wmis.SetGateways(DefaultIPGateway=[chipGW])
                if(intervall!='u'):
                    time.sleep(int(intervall))
                else:
                    doNothing = ''
            os.startfile(startpath + '\\CIT.exe')
            os.system('cls')
            print 'Started IP-Threading'
            print 'Press <Str+C> to stop it...'
            thread.start_new_thread(changeThem,ip,gw)
        except:
            sys.exc_info()
-
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

graphicsH hat geschrieben:

Code: Alles auswählen

            def changeThem(ip,gw):
                getIp()
                getGateWay()
Warum eignest du dir nicht wirklich einfach mal die Grundlagen von Python an? Du rufst getIp() auf, weist das Ergebnis aber nicht zu.

Ich beende jetzt hier für mich diesen Thread. Wenn mein Beispiel oben nicht gereicht hat um den Umgang mit Rückgabewerten aus Funktionen zu demonstrieren, dann weiß ich nicht wie ich elementare Dinge noch einfacher erklären soll.
Antworten