O problema era com as variáveis de ambiente, especificamente que o $ PATH é diferente para tarefas executadas por programas cron vs chamados por mim no terminal como um usuário logado. Chamar echo $PATH
em um cron job e verificar se ele inclui o diretório do interpretador python pode ajudar a confirmar que esse é o problema.
Duas soluções:
1) Rápido e sujo
Encontre onde o interpretador Python está instalado e altere a linha shebang na parte superior do script unix executable / python para chamá-lo diretamente. ou seja,
#!/usr/bin/env python3
torna-se
#!/usr/local/bin/python3
Aqui, não importa se o interpretador python está no caminho ou não, porque sua localização é dada explicitamente. A desvantagem é que sua localização agora é codificada e se você mover o script para um computador diferente, o script pode não funcionar, nem no cron nem quando executado no terminal, se o python tiver sido instalado em um local diferente.
2) Menos rápido, menos sujo
Escreva um script de shell que adicione o local do interpretador python ao caminho, caso ainda não esteja lá (conforme this pergunta SuperUser) e, em seguida, chama o script python. Desta forma, o script não foi alterado e não será quebrado acidentalmente, movendo-o para um computador em que o Python está instalado em um diretório diferente.
#!/bin/bash
# directory python is found in
dir="usr/local/bin"
#add to path if not there
if [ -d "$dir" ] && [[ ":$PATH:" != *":$dir:"* ]]; then
PATH="${PATH:+"$PATH:"}$dir"
fi
#Run program
/path/to/program/program_name
Certifique-se de tornar o script executável via chmod +x /path/to/script/script.sh