Isso está acontecendo porque normalmente quando o processo STDOUT é redirecionado para algo diferente de um terminal, a saída é armazenada em buffer em algum buffer de tamanho específico do SO (talvez 4k ou 8k em muitos casos). Por outro lado, ao enviar para um terminal, o STDOUT será armazenado em buffer de linha ou não será armazenado em buffer, portanto, você verá a saída após cada \n ou para cada caractere.
Você geralmente pode alterar o armazenamento em buffer do STDOUT com o utilitário stdbuf :
stdbuf -oL python script.py > log
Agora, se você tail -F log , deverá ver cada saída de linha imediatamente à medida que ela é gerada.
Alternativamente, o fluxo explícito do fluxo de saída após cada impressão deve alcançar o mesmo. Parece que o sys.stdout.flush() deve conseguir isso em Python. Se você estiver usando o Python 3.3 ou mais recente, a função print também terá uma palavra-chave flush que faz isso: print('hello', flush=True) .