Tema de Viquipèdia:La taverna/Tecnicismes

Yuanga (discussiócontribucions)

Estic passant els codis de python 2.7 a 3x, i em surt aquest error:

ModuleNotFoundError: No module named 'pywikibot.compat'.

Ja no existeix aquet mòdul a 3.x o cal instal·lar-lo d'alguna manera?

Joutbis (discussiócontribucions)

La compat és la llibreria antiga de pywikibot, i és obsoleta de fa temps. Hauries d'instal·lar-te la llibreria "core", que és la bona. L'enllaç és aquest.

Si has estat utilitzant la compat tot aquest temps, pot ser que tinguis algun problema amb les classes del pywikibot, Page, Site, i aquestes. Prova-ho, si de cas, i si tens algun problema digues alguna cosa que intentarem ajudar-te.

Yuanga (discussiócontribucions)

Gràcies @Joutbis La llibreria que tinc em sembla que és la bona. El problema el tinc amb el codi del bot, que fa anys que l'arrossego. Per quines frases hauria de reemplaçar aquestes dues?

from pywikibot.compat import catlib
import urllib,urllib2
Joutbis (discussiócontribucions)

Ostres, doncs sí que és vell el codi, sí. Això de catlib no ho he fet servir mai, però mirant documentació sembla que era alguna eina de gestió de categories, que va acabar integrant-se a la classe Category. Jo el que provaria és:

  • treure el "from pywikibot.compat"... i substituir-ho per "import pywikibot" (sense cometes)
  • buscar al codi on facis servir catlib, perquè les crides no et funcionaran. En aquest README diu el que has de fer. En principi, si tens crides de l'estil catlib.elquesigui(pagina, resta de params) has de fer pagina.elquesigui(resta de params) i ja hauria d'estar.
Yuanga (discussiócontribucions)

Em continuen sortint errors derivats de les llibreries:

Traceback (most recent call last):
 File "/[...]/Python/codi_3.py", line 485, in <module>
   informe=informe+llegeixarbres()+'\n
 
 File "/[..]/Python/codi_3.py", line 449, in llegeixarbres
   pagdistr=urllib.urlopen(url)

NameError: name 'urllib' is not defined
Joutbis (discussiócontribucions)

Pel que sembla, amb python3, la urllib.urlopen ha canviat a urllib.request.urlopen, tal com s'explica aquí. Segons el que faci el codi, pot ser tan fàcil com simplement inserir-hi el "request" entremig. Jo també substituiria "import urllib, urllib2" per "import urllib.request". En tot cas, aquí hi ha alguns exemples de com s'utilitza urllib.request. A veure què tal.

Yuanga (discussiócontribucions)

Ja he solucionat la majoria d'errors que han anat apareixent, però amb aquest no m'en surto:

Després de canviar els "unicode" per "str" em surt:

Traceback (most recent call last):
 File "/[...]/Python/codi_3.py", line 487, in <module>
   informe=unialinia(informe)
 File "/[...]/Python/codi_3.py", line 37, in unialinia
   novalinia=str(linia,"utf-8")
TypeError: decoding str is not supported

Saps per on poden anar els trets?

Joutbis (discussiócontribucions)

Ah, però això és la gràcia del python3, que tot és unicode, i no has d'anar canviant d'una cosa a l'altra, ni anar trencant-te el cap amb decodes, encodes i mandangues d'aquestes. T'ho carregues i ja està. O sigui, "novalinia=linia".

Yuanga (discussiócontribucions)

Moltes gràcies @Joutbis, m'estàs sent d'una grandíssima ajuda.

Ja gairebé ho tinc :) Ara em diu :

AttributeError: module 'pywikibot' has no attribute 'site'

Amb la línia de codi: "site=pywikibot.Site()", i el mateix em passa amb pywikibot.Page()

Joutbis (discussiócontribucions)

Com és la crida a Site()? Entenc que hi poses el 'ca' a dins, no? O sigui, "site=pywikibot.Site('ca')"

Yuanga (discussiócontribucions)

Sí:

site=pywikibot.Site('ca')
desti=pywikibot.Page(site,u"Usuari:Yuanga/proves2")

No sembla error de codi, sinó de configuració. El missatge és "module 'pywikibot' has no attribute 'site'", quan sí que en té aquest atribut, no?

Joutbis (discussiócontribucions)

No, no deu ser això. L'error és així, amb "site" en minúscules? Perquè amb majúscules hi ha de ser segur.

Yuanga (discussiócontribucions)

Tan se val que ho posi amb majúscules com en minúscules.

Joutbis (discussiócontribucions)

I si canvies del tot? en comptes de "site" poses "lloc"? Amb majúscules no pot ser que xafaries el nom de la classe.

Yuanga (discussiócontribucions)

Bon intent, he provat amb:

lloc = pywikibot.Site('ca')
desti = pywikibot.Page(lloc,u"Usuari:Yuanga/proves2")

però l'error persisteix.

Joutbis (discussiócontribucions)

Una idea boja: no deus pas tenir algun fitxer que es digui pywikibot.py, no?

Yuanga (discussiócontribucions)

No (ho he hagut de mirar). Sí que tinc una carpeta anomenada pywikibot dins de la carpeta core, que tinc reanomenada com pywikibot.

Joutbis (discussiócontribucions)

Uf, no sé si pot afectar, però per si de cas... Perquè el PYTHONPATH té l'ordre bé?

Yuanga (discussiócontribucions)

Aquí m'enxampes... com es mira això?

Joutbis (discussiócontribucions)

echo $PYTHONPATH

Pere prlpz (discussiócontribucions)

Això és el mateix que el que en Windows es fa amb echo %PYTHONPATH% ? O és una cosa diferent?

Joutbis (discussiócontribucions)

Sí, en tots els casos són variables d'entorn.

Yuanga (discussiócontribucions)

Ostres, m'has fet adonar-me'n:

sys.path.append('/Users/[...]/Python/core')

La ruta aquesta era errònia!!! Ara sí, ja rutllaaaaa!!! Un hurra per en @Joutbis!!

Pere prlpz (discussiócontribucions)

A mi em funciona així:

 import pywikibot as pwb
 site= pwb.Site('ca')
 pag = pwb.Page(site, "Pastanaga")
Yuanga (discussiócontribucions)

No, assignar-li un àlies a pywikibot no em funciona :(

Yuanga (discussiócontribucions)

Què me'n dius de

cat = site.Category(titcat)
titcat = "Categoria:Articles de prova de MineralBot"

Com es fa a python 3x?

Joutbis (discussiócontribucions)

Ara mateix, el problema no és python 2 o 3, sinó el salt de versió que has fet a pywikibot. El codi aquest és vàlid igualment en qualsevol python. En aquest tros, has d'invertir l'ordre de les sentències (primer assignes titcat, després l'utilitzes). Suposo que l'objectiu és obtenir la llista d'articles de la categoria i fer-hi coses. Prova això:

   site=pywikibot.Site('ca')
   desti=pywikibot.Page(site,u"Usuari:Yuanga/proves2")
   titcat = "Categoria:Articles de prova de MineralBot"
   cat = pywikibot.Category(site,title=titcat)
   for art in cat.articles():
     # cat.articles() és un generador
     # art ja és una Page()
     print(art.title())
     print(art.text)
Yuanga (discussiócontribucions)

Fantàstic @Joutbis! Espero no haver de donar-te la tabarra gaire més. A la teva disposició :)

Joutbis (discussiócontribucions)

Cap problema!

Resposta a «pywikibot amb Python 3x»