Um dos vários redirecionamentos de app-file de “python --version” é repetitivamente “negligenciado” pelo bash, mas os outros não são [closed]

2

Por que bash está passando consistentemente uma saída específica redirecionada de python --version para o console, em vez de anexar ao arquivo, enquanto todas as outras saídas são redirecionadas corretamente?

Estou desenvolvendo um pacote Python dependente de numpy , scipy e h5py e quero configurar as coisas para que eu possa executar automaticamente meu conjunto de testes em várias combinações das diferentes versões dessas dependências ( tipo de implementação de 'IC local'). Estou usando virtualenv para criar pastas diferentes para cada combinação de versões, todas prefixadas com env :

$ ls -1d env*

env-p3.3.6n1.7.0s0.12.0h2.3.1
env-p3.4.0n1.7.0s0.12.0h2.4.0
env-p3.4.4n1.7.0s0.12.0h2.3.1
env-p3.4.4n1.7.0s0.12.0h2.5.0
env-p3.5.1n1.11.0s0.12.0h2.6.0
env-p3.5.1n1.11.0s0.12.1h2.6.0
env-p3.5.1n1.11.0s0.13.0h2.6.0

Na maior parte, o seguinte script testall está funcionando muito bem:

#!/bin/bash

# Store the filename
fname=testresults

# Overwrite the test result file with the date/time
date > $fname
echo -e "\n" >> $fname

# Pull all the env folders in the loop
for fld in $( ls -1 | grep -E "^env" )
do
   # Activate the virtualenv
   source $fld/bin/activate

   # Informative header
   echo "=============================" >> $fname
   echo $fld >> $fname
   python --version >> $fname
   pip freeze | grep -E '^(h5py|numpy|scipy)' >> $fname
   #echo -e "\n" >> $fname

   # Run the tests, dumped to file
   cd opan
   python tests.py --all 2>> ../$fname
   cd ..
   echo -e "\n" >> $fname

   # Leave the virtualenv
   deactivate

done

No entanto, ele está exibindo um pequeno e irritante mau comportamento: a saída da primeira chamada python --version >> $fname está sendo enviada para o console, enquanto todos os outros são redirecionados para o arquivo sem um problema:

$./testall
Python 3.3.6
$ head -n28 testresults
Mon Jun 20 11:07:45 EDT 2016


=============================
env-p3.3.6n1.7.0s0.12.0h2.3.1
h5py==2.3.1                      <=== Python version is missing
numpy==1.7.0
scipy==0.12.0
...........................................................................................................................................................................................................................................................................................................................
----------------------------------------------------------------------
Ran 315 tests in 3.254s

OK


=============================
env-p3.4.0n1.7.0s0.12.0h2.4.0
Python 3.4.0
h5py==2.4.0
numpy==1.7.0
scipy==0.12.0
...........................................................................................................................................................................................................................................................................................................................
----------------------------------------------------------------------
Ran 315 tests in 3.230s

OK

O que está acontecendo aqui? Como posso consertar isso?

    
por hBy2Py 20.06.2016 / 17:49

1 resposta

2

Isso ocorre porque a saída da v3.3.6 estava indo para stderr , não stdout .

Aparentemente, antes da v3.4.0, a saída de python --version é enviada para stderr , enquanto na v3.4.0 e mais tarde essa saída é enviada para stdout .

O redirecionamento de ambos stdout e stderr para o arquivo de saída funciona bem:

python --version >> $fname 2>&1
    
por 20.06.2016 / 17:49