Path Variable e o shebang do script não executarão a versão correta do python

1

Descrição do problema:

Um script bash está sendo usado para criar uma nova sessão de tela para cada nome a partir de uma lista de nomes. Em cada nome, um script python é executado usando esse nome como uma entrada. O script bash define o caminho que contém a versão correta do python (python 3 no pacote anaconda):

#!/bin/sh

export PATH=~/anaconda3/bin/python:$PATH

while read p; do
  screen -dm -S $p bash -c "cd /inside/home/thjmatth/essential; python3 essentialpairs_ttest_tissue_1.py; exec sh"
done <cells.txt

Definir o caminho como acima não permitiu que a versão correta do python fosse executada, então adicionei a seguinte shebang ao script python a ser executado:

#!~/anaconda3/bin/python python3

Ainda não há dados: /usr/bin/python ainda está sendo usado quando não deveria. Como posso ter este programa executando a versão do python de acordo com o caminho que eu especificar?

Tentativa 1:

novo shebang:

#!/inside/home/thjmatth/anaconda3/bin/python/

novo script bash:

#!/bin/sh

export PATH=~/anaconda3/bin/python:$PATH

while read p; do
  screen -dm -S $p bash -c "cd /inside/home/thjmatth/essential; python3 essentialpairs_ttest_tissue_1.py; exec sh"
done <cells.txt

novas permissões no script python:

chmod +x essentialpairs_ttest_tissue_1.py

erro:

bash: python3: command not found

executando qual python nessa tela ainda mostra /usr/bin/python

Solução:

Igual à Tentativa 1 acima, mas alterou a linha 3 do script bash para torná-lo um diretório em vez de um executável:

export PATH=~/anaconda3/bin/python:$PATH
    
por Thomas Matthew 10.01.2017 / 05:03

2 respostas

3
export PATH=~/anaconda3/bin/python:$PATH

Este parece ser o caminho para um executável. PATH deve conter diretórios:

export PATH=~/anaconda3/bin:$PATH
#!~/anaconda3/bin/python python3
  1. As linhas do Shebang precisam de caminhos reais e não executam a expansão do til (no seu Concha). Escreva o caminho real para o executável, começando com / .
  2. Esta linha shebang estaria executando ~/anaconda3/bin/python com o argumento python3 , seguido pelo nome do script. Você provavelmente não quer isso, mas sim executar python ou python3 .

    #!/home/thomas/anaconda3/bin/python
    
screen -dm -S $p bash -c "cd /inside/home/thjmatth/essential; python3 essentialpairs_ttest_tissue_1.py; exec sh"

Se você ainda estivesse executando essa linha depois de atualizar a linha shebang, ela seria ignorada; o python3 de seu PATH (que não é o mesmo que python !) seria executado e executaria o script por vez, e ignoraria a linha shebang como um comentário. Se você tornar o script executável ( chmod +x essentialpairs_ttest_tissue_1.py ), poderá executá-lo diretamente:

./essentialpairs_ttest_tissue_1.py

e a linha shebang seria processada.

Nesse caso, você pode provavelmente escapar apenas corrigindo a variável PATH da primeira seção, a menos que tenha uma configuração de inicialização do Bash que redefina a variável. Se o nome do executável for python , certifique-se de atualizar sua linha de comando screen para usá-la em vez de python3 .

    
por 10.01.2017 / 05:41
1

Possível solução

sobre sua segunda tentativa, com o shebang no script python:

  • Você não pode usar ~ em um shebang; tem que ser o caminho real ( #!/inside/home/thjmatth/... ).
  • Não deve haver um espaço entre o nome do diretório e o nome do programa; tem que ser #!/inside/home/thjmatth/anaconda3/bin/python/python3 .

Verificação de sanidade: Você tem um diretório chamado /inside/home/thjmatth/anaconda3/bin/python que contém um programa executável chamado python3 (isto é, o caminho completo para o programa do intérprete é /inside/home/thjmatth/anaconda3/bin/python/python3 ?

Algo para tentar

Altere seu script para fazer isso:

#!/bin/sh

export PATH=~/anaconda3/bin/python:$PATH

while read p; do
  type python3
  screen -dm -S "$p" bash -c "type python3; exec sh"
done <cells.txt

e veja se você consegue descobrir o que está acontecendo. Se você ainda está preso, edite sua pergunta para incluir a saída dos itens acima.

Outra coisa: Você deve sempre citar todas as referências a variáveis do shell (por exemplo, "$p" ) a menos que você tenha uma boa razão para não e você tem certeza de que sabe o que está fazendo.

    
por 10.01.2017 / 05:35