Quem nunca bateu de frente com uma tela cheia de texto vermelho do pip enquanto tentava rodar um script baixado da internet ou um exercício prático de algum curso?
Eu estava mexendo em um laboratório de testes sobre malware e captura de eventos de teclado (keyloggers educacionais, como os vistos em módulos práticos de segurança da DIO) quando tentei instalar um pacote chamado pyinput na minha máquina com Linux. O resultado foi um festival de backtracking que travou o terminal por vários segundos e terminou com um erro intimidador: ResolutionImpossible.
Abaixo, mostro exatamente o que aconteceu, por que o pip se perdeu nas versões e como resolver essa situação sem quebrar o sistema operacional.
O erro no terminal e o loop do resolvedor#
Ao tentar instalar a dependência diretamente com a flag --break-system-packages:
sr00t3d@sr00t3d:~/script/DIO/MALWARE$ pip install pywin32 --break-system-packages
Defaulting to user installation because normal site-packages is not writeable
ERROR: Could not find a version that satisfies the requirement pywin32 (from versions: none)
ERROR: No matching distribution found for pywin32
Antes dessa tentativa direta, o pip já havia entrado em um ciclo exaustivo de tentativas ao buscar o pacote pyinput:
Using cached pyinput-0.3.1-py2.py3-none-any.whl.metadata (383 bytes)
Using cached pyinput-0.3.0-py2.py3-none-any.whl.metadata (383 bytes)
Using cached pyinput-0.2.0-py2.py3-none-any.whl.metadata (382 bytes)
Using cached pyinput-0.1.0-py2.py3-none-any.whl.metadata (382 bytes)
ERROR: Cannot install pyinput==0.1.0, pyinput==0.2.0, pyinput==0.3.0, pyinput==0.3.1 and pyinput==0.3.2 because these package versions have conflicting dependencies.
The conflict is caused by:
pyinput 0.3.2 depends on pywin32
pyinput 0.3.1 depends on pywin32
pyinput 0.3.0 depends on pywin32
pyinput 0.2.0 depends on pywin32
pyinput 0.1.0 depends on pywin32
To fix this you could try to:
1. loosen the range of package versions you've specified
2. remove package versions to allow pip attempt to solve the dependency conflict
ERROR: ResolutionImpossible: for help visit https://pip.pypa.io/en/latest/topics/dependency-resolution/#dealing-with-dependency-conflicts
Por que o pip falhou e entrou em backtracking#
O resolvedor de dependências do pip adota um algoritmo que tenta satisfazer todas as restrições declaradas pelos pacotes. Quando ele encontra um conflito, ele não desiste de imediato: ele recua (backtracking) e tenta versões anteriores do mesmo pacote para verificar se alguma delas não tem essa exigência.
No caso do pyinput, temos dois problemas bem claros:
Incompatibilidade de plataforma: pywin32 só existe no Windows#
O pacote pyinput possui uma dependência obrigatória: a biblioteca pywin32. Acontece que a pywin32 é uma camada de comunicação entre a runtime do Python e as APIs nativas do Windows (como user32.dll e kernel32.dll).
No Linux, essa biblioteca não existe no PyPI. O repositório oficial retorna (from versions: none) porque não há wheels ou códigos-fonte compiláveis para sistemas operacionais baseados em Unix. Como todas as versões do pyinput (da 0.1.0 até a 0.3.2) exigem pywin32, o pip testou cada uma delas no repositório, não encontrou nenhuma compatível e disparou o erro fatal ResolutionImpossible.
O perigo de usar --break-system-packages#
Ao ver o erro, a primeira reação comum é tentar forçar a instalação usando --break-system-packages.
Em distribuições Linux recentes que adotam a PEP 668 (como Debian, Ubuntu, Fedora ou Arch), o Python do sistema protege seus próprios diretórios contra alterações manuais. Usar essa flag de forma indiscriminada pode sobrescrever pacotes que ferramentas do próprio sistema operacional usam para funcionar. Se uma biblioteca compartilhada do sistema for alterada ou corrompida, comandos básicos do gerenciador de pacotes da distribuição podem parar de responder.
Como resolver o problema na prática#
Se você está desenvolvendo ou estudando automações e ferramentas de teste de segurança no Linux, existem duas formas diretas de lidar com a situação:
1. Trocar pyinput por pynput (a melhor alternativa no Linux)#
Muitas vezes o erro acontece por uma simples confusão de nomes. O pacote antigo pyinput foi escrito apenas para Windows. Já a biblioteca moderna e mantida para captura e controle de periféricos é a pynput (com 'n').
A pynput é multiplataforma e sabe se comunicar diretamente com o servidor gráfico do Linux (seja X11 ou Wayland), sem depender de chamadas do Windows.
Para testar de forma limpa, crie um ambiente virtual em vez de instalar no Python global:
# Criar o ambiente virtual isolado
python3 -m venv .venv
# Ativar o ambiente virtual
source .venv/bin/activate
# Instalar a biblioteca correta
pip install pynput
Comparativo direto entre as opções disponíveis:
| Biblioteca | Plataformas suportadas | Como captura eventos | Observações de uso |
|---|---|---|---|
| pynput | Linux, Windows, macOS | Usa subsistemas gráficos (X11/Wayland/WinAPI) | Recomendada para scripts educacionais e automações de usuário |
| keyboard | Linux, Windows | Requer privilégios de root (sudo) no Linux | Lê diretamente dos descritores em /dev/input/ |
| pyinput | Apenas Windows | Depende exclusivamente de pywin32 | Pacote antigo e incompatível com Linux |
2. Adaptando o código para usar pynput#
Se o seu código de estudo veio com a importação antiga do Windows, a adaptação para pynput é simples e funciona direto no Linux:
Abordagem legada (restrita a Windows):
import pyinput
# Código amarrado nas APIs do Windows
Abordagem portável com pynput (compatível com Linux e Windows):
from pynput import keyboard
def ao_pressionar(tecla):
try:
print(f"Tecla digitada: {tecla.char}")
except AttributeError:
print(f"Tecla especial: {tecla}")
with keyboard.Listener(on_press=ao_pressionar) as monitor:
monitor.join()
Esse ouvinte captura teclas alfanuméricas e teclas especiais (como Shift, Enter ou Backspace) sem depender de nenhuma DLL do Windows.
3. E se você realmente precisar rodar o script original do Windows?#
Se o laboratório exige obrigatoriamente as chamadas nativas da API do Windows (pywin32), não tente forçar o Linux a executar o código diretamente.
A alternativa correta nesse cenário é usar uma máquina virtual com Windows ou um contêiner adequado. Dentro do prompt do Windows, a instalação ocorre sem nenhum atrito de resolução:
:: No terminal do Windows (Prompt de Comando ou PowerShell)
python -m pip install --upgrade pip
pip install pywin32
pip install pyinput
Cuidados com wayland e permissões de teclado no Linux#
Um detalhe prático que costuma pegar quem migra scripts de captura de input para o Linux é a diferença entre X11 e Wayland.
Por padrão de segurança, o Wayland isola as janelas para evitar que um aplicativo espione o que você digita em outro. Se você estiver rodando uma sessão Wayland, a pynput pode não conseguir interceptar eventos globais fora da janela do terminal onde o script foi iniciado.
Se você precisar rodar scripts de automação ou estudos de captura global no Linux:
- Verifique a sessão gráfica com o comando
echo $XDG_SESSION_TYPE. - Em sessões X11, a captura global funciona de forma direta.
- Em sessões Wayland, pode ser necessário rodar o script em uma sessão X11 (selecionável na tela de login) ou configurar permissões de leitura no grupo
inputpara acessar os descritores em/dev/input/.
Isolar o ambiente com venv e entender as bibliotecas nativas de cada sistema evita perder horas brigando com o resolvedor de dependências do pip.
Este artigo foi útil?
Deixe uma reação rápida para apoiar o conteúdo:
Este post está licenciado sob CC BY-NC.



Comentários
Participe da discussão abaixo.
0 comentários