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...
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.
En osaa pyyttonia, mutta epäilyttää tuo heittomerkki, liekkö siellä pitäisi olla toinenkin?
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ä.
tmp=open('/test/update1.txt', 'w')
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?
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.
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.
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
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('"'))
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']
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
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)
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ää.)
öö 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.
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.)
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? :)
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
Ookei, luen oppaat uusiks ja koitan opetella, jos ei onnistu niin tuun takas vinkumaa riesaksenne ;) :P
Aihe on jo aika vanha, joten et voi enää vastata siihen.