[Python] globale variabele counter + wegschrijven file

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Bl4ckviper
  • Registratie: Mei 2002
  • Laatst online: 06-08 00:09
Mensen,

Voor performance testen ben ik hier gezellig grinder scripts aan het aanpassen. Dit zijn opgenomen scripts adhv muisklikken en hier komt python uitzetten. Nu is mijn ervaring met python 0,0.. Maar met een java achtergrond dacht ik dat het vast niet al te moeilijk moet zijn.

Hoop is al gelukt alleen wil het volgende maar niet voor elkaar komen;

Ik wil dus een counter gebruiken om gebruikersnaam te postfixen en deze gebruikersnamen vervolgens weg te schrijven in een .properties file (CSV) zodat ik deze kan inlezen bij mijn inloggen test.

Wat ik nu doe doe in de eerste grinder test is het volgende:

Python:
1
2
3
4
5
6
7
8
9
10
11
12
counter = 1

def page1(self):
    "Counter ophogen."
    global counter
    counter +=1
    self.gebruikersNaam = 'GrinderTest'+str(counter)
    print(self.gebruikersNaam)
    file = open('.\generatedUsernames.properties', 'w')
    file.write(self.gebruikersNaam)
    file.write(',')
    file.close


Ik heb dit na zoeken via google gevonden. Nu wil het alleen zo zijn dat de counter niet opgehoogd wordt en er ook maar echt 1 waarde word weggeschreven.. Ondanks dat de test vaker runt (GrinderTest2 wordt dus regelmatig geprint maar niet opgehoogd en weggeschreven.)

Wat ik dus eigenlijk wil is een static variable ipv een instantie. Om maar even de vergelijking met Java te trekken.

Be fast .... Be furious....


Acties:
  • 0 Henk 'm!

  • eek
  • Registratie: Februari 2001
  • Laatst online: 06-04-2020

eek

@MagickNET

Het lijkt erop dat dit script voor iedere run geladen en uitgevoerd wordt. Bij het laden wordt deze op 1 gezet en binnen je page1 wordt deze verhoogd naar 2. Mogelijke oplossing is om deze counter te lezen en te schrijven naar een ander bestand.

Skill is when luck becomes a habit.


Acties:
  • 0 Henk 'm!

  • Ram0n
  • Registratie: Maart 2002
  • Laatst online: 03-07 13:05

Ram0n

Bierbrouwende nerd

Precies, wordt dit programma telkens opnieuw gerund? Dan is dit te verwachten gedrag. Een mogelijke oplossing is dan inderdaad om de counter aan het einde weg te schrijven naar een file, en bij de start in te lezen. Een static variabele kan alleen werken als het programma tussendoor wel blijft bestaan, zodra je het stopt verlies je ook die variabelen.

Eigenaar/brouwer Milky Road Brewery


Acties:
  • 0 Henk 'm!

  • Bl4ckviper
  • Registratie: Mei 2002
  • Laatst online: 06-08 00:09
Het is opgenomen met Grinder. Ik was in de veronderstelling dat het zelfde vaker uitgevoerd wordt. Het is tenslotte om load testing te doen. Ik ga wel proberen om het in een file te doen.

Be fast .... Be furious....


Acties:
  • 0 Henk 'm!

  • Bl4ckviper
  • Registratie: Mei 2002
  • Laatst online: 06-08 00:09
Ik krijg dat dus helaas ook niet voor elkaar.. iemand nog een briljant idee?

Wat ee #$!@#$ spul is dat python zeg..

Be fast .... Be furious....


Acties:
  • 0 Henk 'm!

  • ValHallASW
  • Registratie: Februari 2003
  • Niet online
Jahoor, een programmeertaal de schuld van je eigen incapabiliteit geven.

Tip: lees het geschreven bestand uit - open('.\generatedUsernames.properties').read(), parse die string, hoog met een op en schrijf weer weg.

Acties:
  • 0 Henk 'm!

  • user109731
  • Registratie: Maart 2004
  • Niet online
Je moet haakjes toevoegen om de methode aan te roepen. Al is dat niet heel belangrijk hier, omdat het script hierna toch afgesloten word.
Bl4ckviper schreef op dinsdag 29 december 2009 @ 13:51:
Ik krijg dat dus helaas ook niet voor elkaar.. iemand nog een briljant idee?

Wat ee #$!@#$ spul is dat python zeg..
Come on, vergeleken met Java is IO enzo in python juist vreselijk eenvoudig. Wat lukt er niet?
- file openen: open('foo', 'r') # 'w' voor schrijven
- schrijven: f.write(s)
- lezen: s = f.read()
- splitten: parts = s.split(bla)
- string naar int: i = int(s)

Stuk voor stuk zeer intuitief en met een beetje googlen te vinden...

Acties:
  • 0 Henk 'm!

  • Bl4ckviper
  • Registratie: Mei 2002
  • Laatst online: 06-08 00:09
JanDM schreef op dinsdag 29 december 2009 @ 15:00:
[...]

Je moet haakjes toevoegen om de methode aan te roepen. Al is dat niet heel belangrijk hier, omdat het script hierna toch afgesloten word.

[...]

Come on, vergeleken met Java is IO enzo in python juist vreselijk eenvoudig. Wat lukt er niet?
- file openen: open('foo', 'r') # 'w' voor schrijven
- schrijven: f.write(s)
- lezen: s = f.read()
- splitten: parts = s.split(bla)
- string naar int: i = int(s)

Stuk voor stuk zeer intuitief en met een beetje googlen te vinden...
Werkend

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
"Counter ophogen."
    filecounterread = open('.\counter.properties', 'r')
    self.counter = int(filecounterread.read())
    filecounterread.close()
    print 'Voor de ophoging '+str(self.counter)
    self.counter +=1
    print 'Na de ophoging '+str(self.counter)
    filecounterwrite = open('.\counter.properties', 'w')
    filecounterwrite.write(str(self.counter))
    filecounterwrite.close()
    self.gebruikersNaam = 'GrinderTest'+str(self.counter)
    print 'Gebruikersnaam == '+str(self.gebruikersNaam)
    filegebruikersnamen = open('.\generatedusernames.properties', 'a')
    filegebruikersnamen.write(self.gebruikersNaam)
    filegebruikersnamen.write(',')
    filegebruikersnamen.close()


2 keer openen dus 1 keer als read en 1 keer als write r+ werkt dus niet ;)

verder was ik de () vergeten bij filegebruikersnamen. kwam er achter na het nog even doorlezen van jullie stukjes daarin noemde je je read en write echt afzonderlijk. Verder maakt die close() itt close wel veel uit.

Vreemd is wel dat dat ding zeurt over indenting en niet over dat soort dingen maar goed _/-\o_

[ Voor 52% gewijzigd door Bl4ckviper op 29-12-2009 16:14 ]

Be fast .... Be furious....


Acties:
  • 0 Henk 'm!

  • user109731
  • Registratie: Maart 2004
  • Niet online
Bl4ckviper schreef op dinsdag 29 december 2009 @ 15:04:
Vreemd is wel dat dat ding zeurt over indenting en niet over dat soort dingen maar goed _/-\o_
Dat kan niet omdat functies (en methoden) in Python first-class citizens zijn, zodat je zoiets kunt doen:
Python:
1
2
3
f = open('foo')
c = f.close
c()

f.close is dus opzich goede syntax, het is alleen niet wat jij hier wil :)
2 keer openen dus 1 keer als read en 1 keer als write r+ werkt dus niet
Het file object houd intern de 'positie' in het bestand bij. Na f.read() staat de pointer aan het eind van het bestand, en write() zet de string daar dan ook neer. Met seek() kun je de 'pointer' weer verplaatsen naar het begin van het bestand, het volgende werkt dus wel:
Python:
1
2
3
4
5
6
f = open('foo.txt', 'r+')
i = int(f.read().strip())
i += 1
f.seek(0)
f.write(str(i))
f.close()

Niet echt een Python probleem, zo werkt het in vrijwel alle talen :)
Pagina: 1