Como executar um script Python no Makefile

1

Eu quero escrever um Makefile para encontrar arquivos específicos e executar um script Python em cada arquivo. O script Python aceita sys.stdin input.

find $(W)/$(OVE) -name "*.xml" -print | \
while read x ; do \
  cat $x | /opt/exp/bin/python2.7 process_results.py > $(W)/$(OVE)/$(dirname $x)_$(basename $x).xml \
done

A saída é o arquivo $(dirname $x)_$(basename $x).xml , que é um arquivo _.xml vazio.

Quando eu executo este comando na linha de comando, ele funciona corretamente, mas no Makefile ele não funciona.

Você pode me ajudar o que há de errado com esse comando?

    
por Hamideh 24.11.2012 / 12:25

3 respostas

2

Primeiro, você precisa citar os cifrões que devem ser interpretados pelo shell. Como é, $x e $(dirname $x) e $(basename $x) são analisados por make. Você também está perdendo um ponto-e-vírgula no final do corpo do loop while. Verifique a saída de execução make, você deve ver o shell reclamando sobre isso.

find $(W)/$(OVE) -name "*.xml" -print | \
while read x ; do \
  cat $$x | /opt/exp/bin/python2.7 process_results.py > $(W)/$(OVE)/$$(dirname $$x)_$$(basename $$x).xml; \
done

Outro provável problema é que $(dirname $x) já contém a parte $(W)/$(OVE) . Por exemplo, se $(W) for foo e $(OVE) for bar e $x for subdir/subsubdir/wibble.xml , você acabará tentando gravar arquivos como foo/bar/foo/bar/subdir/subsubdir_wibble.xml.xml , enquanto provavelmente você vai querer escrever foo/bar/foo/bar/subdir/subsubdir_wibble.xml.xml . Também é estranho que você esteja transformando um arquivo .xml em um arquivo .xml.xml . Se você quisesse remover a extensão .xml original, precisará escrever basename $$x .xml , mas é inútil remover a extensão apenas para adicioná-la novamente. Então você provavelmente quis escrever:

find $(W)/$(OVE) -name "*.xml" -print | \
while read x ; do \
  /opt/exp/bin/python2.7 process_results.py <$$x >$$(dirname $$x)_$$(basename $$x); \
done

Um outro problema é que, se qualquer uma das execuções de process_results.py falhar, o make continuará sendo executado e ainda relatará uma compilação bem-sucedida. Diga ao shell para parar se ocorrer um erro:

set -e; \
find $(W)/$(OVE) -name "*.xml" -print | \
while read x ; do \
  /opt/exp/bin/python2.7 process_results.py <$$x >$$(dirname $$x)_$$(basename $$x); \
done
    
por 24.11.2012 / 16:20
2

$x , $(dirname $x) etc ... serão todos confundidos por make, uma vez que os interpretam como suas próprias variáveis. É melhor colocar isso em um shellscript de uma linha e chamar isso do Makefile.

    
por 24.11.2012 / 13:03
2

Você precisa citar os sinais de dólar que deseja passar para o shell, caso contrário make tentará interpretá-los.

-find $(W)/$(OVE) -name -print | \
  while read x ; do \
      cat $$x | /opt/exp/bin/python2.7 process_results.py \
        > $(W)/$(OVE)/$$(dirname $$x)_$$(basename $$x).xml; \
  done

Os únicos sinais de dólar são expansões variáveis. Os dois sinais de dólar são passados para a linha de comando como um único sinal de dólar.

    
por 24.11.2012 / 13:05