Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Python Update-Itself

Sivun loppuun

Dain [18.02.2011 08:03:29]

#

Moro! Elikkä kyllästyin tekemään jotain normaaleja tekstintulostusohjelmia, ja otin haasteekseeni rakentaa pikku python-ohjelman, joka käynnistettäessä päivittää itse itsensä.

Tälläistä löysin googlettamalla:

# -*- coding: utf-8 -*-

import urllib2

update=str(urllib2.urlopen('http://talesofcalmyd.dy.fi/serv.txt'))
lineOne = float(current.readlines()[0].strip('"'))
for line in update:
  if 'version = ' in line:
    if line[9:] > lineOne:
      ntu=True #need to update
  if ntu:
    for file in files_to_update:
      tmp=open(file '/test/update1.txt)
      tmp.write(urllib2.urlopen(file))
      tmp.close()

import main

Lisäksi serveripäähän käskettiin lisäämään: server.txt tiedosto, jossa lukee näin: version = 0.1
state = stable
files_to_update = ['main.py, info.txt'] siis esimerkkinä. Käsittääkseni ohjelman tulisi noutaa kyseisestä tiedostosta versio, ja tiedostot. Muokkasin koodissa olevan linkin kyseiseen tiedostoon.

Tästä rivistä komentorivi antaa virhettä:
tmp=open(file '/test/update1.txt)

Voisiko joku tarkalleen kertoa mitä se tekee, ja miksi se ei hyväksy polkuani?

Kiitoskia

Dain

Pps. toivottavasti tämä on ainut ongelmani...

jalski [18.02.2011 08:27:50]

#

Dain kirjoitti:

Tästä rivistä komentorivi antaa virhettä:
tmp=open(file '/test/update1.txt)

Voisiko joku tarkalleen kertoa mitä se tekee, ja miksi se ei hyväksy polkuani?

Kiitoskia

Dain

Pps. toivottavasti tämä on ainut ongelmani...

Tsekkaapas Googlettamalla nopeasti Pythonin dokumentaatiota.

Epäilen, että tuolle open() funktiolle pitäisi vielä antaa parametrina, avataanko tiedosto lukemista vai kirjoittamista varten. Oletustila on varmaankin pelkkä lukeminen, jolloin tiedoston pitäisi olla jo valmiiksi olemassa, eikä tiedostoon tietenkään pelkillä lukuoikeuksilla voi kirjoitellakaan.

Spongi [18.02.2011 10:33:25]

#

En osaa pyyttonia, mutta epäilyttää tuo heittomerkki, liekkö siellä pitäisi olla toinenkin?

Chiman [18.02.2011 10:48:11]

#

Tuossa on useita virheitä. Googletin netistä alkuperäisen pätkän, ja se oli sielläkin yhtä ei-toimivana.

Esim. files_to_update-muuttujaa ei ilmesty nimiavaruuteen vain siten, että se lukee merkkijonomuuttujassa. Tuollaista muuttujaa ei siis ole, vaikka sitä yritetään käyttää for-silmukassa.

Toinen on tuo mainittu open(file '/test/update1.txt) -kohta, josta en edes keksi, mitä siinä on tarkalleen yritetty. Heittomerkki vaatisi parin, muttei se yksin riitä.

XYZ [18.02.2011 11:28:08]

#

tmp=open('/test/update1.txt', 'w')

Dain [18.02.2011 15:47:17]

#

Googlettamalla tsekkailin joo.. no Aika aloittelija olen tämän kanssa, myönnetään pois, mutta haluan joskus saaha jotakin aikaseks niin olis taas joskus motivaatiota. Ei oikee tunnu edistyvän noitten tekstintulostusten yms. kanssa.

XYZ kokeilen tuota.

E:

Homma kusee... :S


" File "autopaivitys.py", line 5, in <module>
update=str(urllib2.urlopen('http://talesofcalmyd.dy.fi/serv.txt'))
File "/usr/lib/python2.6/urllib2.py", line 126, in urlopen
return _opener.open(url, data, timeout)
File "/usr/lib/python2.6/urllib2.py", line 397, in open
response = meth(req, response)
File "/usr/lib/python2.6/urllib2.py", line 510, in http_response
'http', request, response, code, msg, hdrs)
File "/usr/lib/python2.6/urllib2.py", line 435, in error
return self._call_chain(*args)
File "/usr/lib/python2.6/urllib2.py", line 369, in _call_chain
result = func(*args)
File "/usr/lib/python2.6/urllib2.py", line 518, in http_error_default
raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 404: Not Found"


Parempi kai palata "Hello Worldin" tulostamsiee eri väreillä eri koordinaatteihi... TAi johonki perus, mikä on nimesi? No Terve "nimi"!

E: sain samantien errorit pienemmäks.....


Traceback (most recent call last):
File "autopaivitys.py", line 6, in <module>
lineOne = float(current.readlines()[0].strip('"'))

Mutta mikäs tuo nyt sitten tarkoittaa?

Chiman [18.02.2011 16:18:06]

#

Dain kirjoitti:

Traceback (most recent call last):
  File "autopaivitys.py", line 6, in <module>
    lineOne = float(current.readlines()[0].strip('"'))

Mutta mikäs tuo nyt sitten tarkoittaa?

Vaikea sanoa, koska jätit siitä varsinaisen virheilmoituksen pois. Eli pastea vielä tuosta seuraava rivi tai pari.

Dain [18.02.2011 16:22:45]

#

Fail, jäi vikarivi ilmotuksesta... :S

Traceback (most recent call last):
File "autopaivitys.py", line 6, in <module>
lineOne = float(current.readlines()[0].strip('"'))
NameError: name 'current' is not defined

Semmosta.

-tossu- [18.02.2011 16:30:12]

#

Virhe johtuu siitä, ettei current:ia ole määritelty. Ennen tiedoston lukemista se pitää luonnollisesti avata open-funktiolla.

Tuosta koodista näyttää puuttuvan muutakin. Esimerkiksi toinen määrittelemätön asia on files_to_update

nixfan [18.02.2011 16:33:48]

#

Sinulla ei ole current -muuttujaa olemassa. Se pitäisi ilmeisesti olla tuo update -muuttuja... Siitä kylläkin pitää poistaa tuo str() -funktio pois, koska urlopen palauttaa file objektin. Joten muutappa nuo kaksi alun riviä tälläisiksi:

update = urllib2.urlopen('http://talesofcalmyd.dy.fi/serv.txt')
lineOne = float(update.readlines()[0].strip('"'))

Dain [18.02.2011 16:36:18]

#

Traceback (most recent call last):
  File "autopaivitys.py", line 6, in <module>
    lineOne = float(update.readlines()[0].strip('"'))
ValueError: invalid literal for float(): version = 0.1

Tarkoittaako tämä sitten sitä että se ei jotenkin saa luettua sitä versiota?

Eli palvelin päässä tiedot:

version = 0.1
state = stable
files_to_update = ['main.py, info.txt']

nixfan [18.02.2011 16:44:09]

#

Aijaa, sieltä tulee tuollaista dataa... Ei tuo float -funktio pysty muuntaa liukuluvuksi tuollaista kuin version = 0.1, sinun pitäisi parsia tuosta alusta tuo 'version =' pois.

Lisäksi tuolla lopussa on virheitä myös, kuten tuo -tossu- mainitseekin niin missään ei määritellä files_to_update -muuttujaa

Metabolix [18.02.2011 16:48:56]

#

Jos haluat oppia ohjelmoimaan, ohjelmoi äläkä yritä kopioida rikkinäistä koodia. Kopioiminen ei ole ohjelmointia, ja jos joku täältä avuliaasti korjaa koodin ongelmat, et todellakaan ole saanut itse mitään aikaan.

Tässä on pari apufunktiota, jotka sinun olisi pitänyt ensi töiksesi tuon löytämäsi koodin pohjalta kehittää:

import urllib2

def lataa_teksti(url):
	return urllib2.urlopen(url).read()

def lataa_tiedosto(url, tiedosto):
	data = lataa_teksti(url)
	f = open(tiedosto, "w")
	f.write(data)
	f.close()

Näiden (ja Python-oppaan) avulla sinun pitäisi jo osata toteuttaa tuo päivitys. Funktiolla lataa_teksti voit ladata netistä tekstitiedoston, jossa on vaikka pilkulla eroteltuina versio ja tiedostojen nimet, ja sitten voit ladata tiedostot funktiolla lataa_tiedosto.

# Lataa tiedot.
# Muoto voisi olla esimerkiksi tällainen: 0.1, main.py, info.txt
tiedot = lataa_teksti("http://sivut/tiedot.txt")

# Tulkitse tiedot, ja jos pitää päivittää, lataa tiedostot:
for tiedosto in tiedostot:
	osoite = "http://sivut/tiedostot/" + tiedosto
	lataa_tiedosto(osoite, tiedosto)

-tossu- [18.02.2011 16:51:00]

#

Dain kirjoitti:

ValueError: invalid literal for float(): version = 0.1

Tarkoittaako tämä sitten sitä että se ei jotenkin saa luettua sitä versiota?

Ei vaan sitä, että yrität muuttaa tekstiä version = 0.1 liukuluvuksi.

Nixfan taisi neuvoa hieman väärin; current:n pitäisi ilmeisesti olla tiedosto, jossa on tallennettuna ohjelman nykyinen versio, jonka mukaan ohjelma päättelee, tarvitaanko päivitystä vai ei.

Sinuna en yrittäisi tehdä tuon koodin pohjalle mitään, koska siinä on moni asia pielessä. Ensinäkään ohjelman tavassa hakea tiedot uusista versioista palvelimelta ei ole mitään järkeä. Toiseksi en näe mitään syytä miksi if ntu: on silmukan sisällä. Myöskään URL-kahvojen kirjoittamisessa tiedostoon ei ole paljoa järkeä.

Edit: Tämä on siis vastaus Dainin edelliseen viestiin, mutta tähän ehtikin tulla muutama viesti väliin.

(Mod. lisäsi lainauksen. Kannattaa käyttää.)

Dain [18.02.2011 17:23:37]

#

öö en haluais enää vaivata... mutta niin... :S

for tiedosto in tiedostot:
osoite = "http://sivut/tiedostot/" + tiedosto
lataa_tiedosto(osoite, tiedosto)

Tuosta antaa tämmöse virhee (urlin toki muutin omaks... :D)


Traceback (most recent call last):
File "autopaivitys.py", line 17, in <module>
for server.txt in tiedostot:
NameError: name 'tiedostot' is not defined

Defined on kait määrittää, määrittelemätön tms. Eli siis mitä mä nyt oon taas toilaillut...? :O ilmeisesti jättänyt muuttamatta/määrittämättä tuon kohdan "tiedostot" mutta kun en vieläkää hoksannu mitä siihe tulee.

Metabolix [18.02.2011 17:29:07]

#

Niin, ei se muuttuja mistään itsekseen ilmesty. Koodissani lukee, että "tulkitse tiedot", ja se osuus sinun pitäisi nyt itse koodata oikeaan väliin. Mieti nyt ihan järjellä, missä muuttujassa on tietoa ja mitä tietoa siinä muuttujassa on ja mitä sille tiedolle pitäisi tehdä, jotta saisit siitä irti listan (siis Pythonin ymmärtämän listan) päivitettävistä tiedostoista. (Python-oppaan 6. osassa on tähänkin lähes suora vastaus, eli et ole tainnut opetella alkeita riittävästi.)

-tossu- [18.02.2011 17:29:25]

#

Dain kirjoitti:

Eli siis mitä mä nyt oon taas toilaillut...? :O ilmeisesti jättänyt muuttamatta/määrittämättä tuon kohdan "tiedostot" mutta kun en vieläkää hoksannu mitä siihe tulee.

Siihen tulee lista päivitettävistä tiedostoista. Metabolixin idea oli varmasti, että tekisit itse koodin, joka käsittelee palvelimen antaman datan ja sen mukaan laittaisi päivitettävät tiedostot tuohon listaan.

Edit: Miten on mahdollista, että Metabolix on aina minua nopeampi? :)

Chiman [18.02.2011 18:59:38]

#

Opettele alkeita ensin, muuttujien määrittelyä yms.

Se, että sinulla on tekstijonomuuttujassa "a = 1", ei tarkoita että muuttuja a olisi koodissa käytettävissä. Eli:

s = 'a = 1'
print a # antaa virheen: NameError: name 'a' is not defined

Dain [18.02.2011 22:04:04]

#

Ookei, luen oppaat uusiks ja koitan opetella, jos ei onnistu niin tuun takas vinkumaa riesaksenne ;) :P


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta