Tomando uma surra do psycopg2

- 7 mins

Acabei de levar uma surra do psycopg2

E resolvi registrar aqui porque o problema era basicamente eu ser cabaço demais pra ser atendida pelas soluções encontradas no Google. Pensei nas pobres almas que, como eu, vagam pela internet colando erros e dando com a cara na porta porque ninguém explica “for dummies” o suficiente.

A situação era a seguinte:

Eu atualizei recentemente o Ubuntu para a versão 20.04 LTS Focal Fossa, e depois disso meu Django desconfigurou ou algo do tipo. Assim, não tenho aquela certeeeeza de que o problema foi mesmo esse, mas foi o que eu identifiquei de diferente desde a última vez em que eu tinha rodado o projeto com sucesso na minha máquina. Enfim, eu precisava (preciso, demais) rodar o backend do Futuur localmente para testar uma nova feature, mas na hora de rodar o pip install -r requirements.txt (esse é o comando que garante que todas as libs e pacotes necessários ao projeto estão instalados no seu repo local), dava de cara num erro reclamando de um tal psycopg2 que nunca tinha ouvido falar.

Ah, eu vou ser sincera aqui, já que a proposta do post é justamente assumir a ignorância de novata. Você também se sente ignorante quando roda o StackOverflow de cabo a rabo tentando corrigir um erro, e no fim das contas descobre que era alguma coisa muito idiota que te escapava porque simplesmente você nunca tinha mexido com aquilo nem sabia como funciona? Dá um abraço aqui. Todo mundo passa por isso (eu acho). Bem, se não todo mundo, ao menos algumas pessoas, e poxa: pessoas que tão aí, no mercado, se virando pra trabalhar e aprender ao mesmo tempo do jeito que dá. Então relaxa que vai dar tudo certo.

Voltando aqui ao assunto. O erro que gritava em vermelho do console, depois de já ter instalado tipo quase todos os requirements, dizia (resumidamente) o seguinte:

psycopg/psycopgmodule.c: In function ‘psyco_is_main_interp’:
    psycopg/psycopgmodule.c:689:18: error: dereferencing pointer to incomplete type ‘PyInterpreterState’ {aka ‘struct _is’}
      689 |     while (interp->next)
          |                  ^~
    
    It appears you are missing some prerequisite to build the package from source.
    
    You may install a binary package by installing 'psycopg2-binary' from PyPI.
    If you want to install psycopg2 from source, please install the packages
    required for the build and try again.
    
    For further information please check the 'doc/src/install.rst' file (also at
    <http://initd.org/psycopg/docs/install.html>).
    
    error: command 'x86_64-linux-gnu-gcc' failed with exit status 1
    ----------------------------------------
ERROR: Command errored out with exit status 1: <blablabla, caminho do projeto no meu computador>/env/bin/python -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-s0gonu5m/psycopg2/setup.py'"'"'; __file__='"'"'/tmp/pip-install-s0gonu5m/psycopg2/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /tmp/pip-record-tbwshzmi/install-record.txt --single-version-externally-managed --compile --install-headers <blablabla caminho do projeto>/env/include/site/python3.8/psycopg2 Check the logs for full command output.

Até respirei fundo aqui de ler isso de novo. Não tenho nem coragem de admitir quanto tempo fiquei batendo cabeça sem conseguir resolver essa bosta. Ah, eu prometi que ia ser sincera sobre a minha ignorância, né? Tá bem, eu perdi um dia e meio de trabalho com isso. Que vergonha. Enfim. ¯\(ツ)

Bom, tem várias soluções que parecem fazer todo o sentido (kkkk até parece que a gente entende o comando que copia e cola da resposta antes de ter certeza que deu mesmo certo) no StackOverflow, AskUbuntu, issues do próprio psycopg2, blogs profissionais e por aí vai. A maioria envolve instalar algumas bibliotecas, atualizar outras, esse tipo de coisa. Se você chegou até aqui, suponho que nenhuma adiantou — se chegou aqui antes de vê-las, vai lá e só volta se não funcionar —, como foi o meu caso. E qual foi o meu caso?

Meu caso foi que eu ainda morro de medo de mexer em qualquer arquivo importante do projeto que não esteja totalmente sob meu controle (como os da feature que eu estiver desenvolvendo no momento, por exemplo) e possa zoar o trabalho do resto do time. Irreversivelmente. Talvez até explodir alguma coisa. E se você é cabaço como eu, aposto que tem o mesmo medo. Vou te contar então como eu resolvi o problema e em qual arquivo precisei mexer. Mas antes, vou explicar como descobri o que precisava fazer.

Como lidar?

Depois de desinstalar/reinstalar/desintalar de novo o psycopg2-binary mil vezes, tentar instalar uma versão anterior mais mil (sem sucesso, o console respondia que não havia encontrado a versão — ué, mas… quê?), eu fiz o seguinte:

1. Executei um pip freeze pra ter certeza de que o raio do troço tava lá — e tava, na versão mais recente;

2. Abri o arquivo requirements.txt pra ter certeza de que o raio do troço tava lá — e tava, mas numa versão anterior. UÉ

3. Fui no lugar mais óbvio, mas que não costuma adiantar se você não souber exatamente o que está procurando, principalmente se não conhecer o software em questão: sim, ela, a documentação do psycopg2. No tópico “Problems compiling and installing psycopg2”, tinha a seguinte pergunta frequente:

Psycopg 2.8 fails to install, Psycopg 2.7 was working fine. With Psycopg 2.7 you were installing binary packages, but they have proven unreliable so now you have to install them explicitly using the psycopg2-binary package. See Quick Install for all the details

Olha como a culpa não é minha (só concorda, vai): não é exatamente óbvio que “but they have proven unreliable so now you have to install them explicitly” significa que a versão foi descontinuada. Ou pelo menos foi isso que eu entendi, somando essa informação com a resposta do console quando tentei instalar explicitamente a versão 2.7. Esteja eu certa ou não nessa interpretação, o que importa é que me ocorreu a possibilidade da versão do nosso requirements.txt simplesmente não estar mais disponível por ter sido descontinuada após o novo release. E aí veio o passo:

4. Tomei um copo d’água, respirei fundo e editei o arquivo requirements.txt, substituindo psycopg2==2.7.7 por psycopg2==2.8.6 (isso é mais drama, tá, eu sei que não teria problemas em reverter essa ação e que ela não teria impacto imediato no projeto em produção, por estar em um repositório local com controle de versionamento, o bom e velho git. Se você não sabe disso, é algo muito valioso de se entender, porque é o que vai segurar a sua mão quando for mandar o famoso “só mudar e ver se funciona”). E aí rodei de novo o pip install -r requirements.txt. E voilà. Funcionou.

Depois disso, eu avisei ao meu colega desenvolvedor backend e perguntei se tinha problema. Ele falou que tudo bem, a gente testa em staging. Então, é isso, a gente vai testar em staging. Fim da historinha que eu tinha pra contar hoje.

Lição do He-Man

A moral aqui acho que não é como lidar com o psycopg2, nem com o Django, talvez nem com o requirements.txt especificamente. Eu resolvi escrever esse post por dois motivos: 1) colocar em algum lugar da internet essa solução, já que eu não achei, mais alguém pode precisar; e 2) dar uma dica de como encarar um erro quando se é inexperiente e por isso às vezes não sabe nem por onde começar. Cada vez vai ser diferente, mas acho que na próxima eu talvez esteja mais sagaz pra identificar se o problema é uma versão defasada de lib, verificar se o que eu tô tentando instalar ainda existe (risos) e ter coragem de meter a mão na parada, me certificando que tá tudo certo com o git e comunicando (ou perguntando se tem problema) colegas que vão precisar disso depois.

Letícia Monteiro

Letícia Monteiro

Python has saved my life

rss facebook twitter github gitlab youtube mail spotify lastfm instagram linkedin google google-plus pinterest medium vimeo stackoverflow reddit quora quora