web-dev-qa-db-fra.com

Comment faire pour que python Shebang utilise python3?

J'ai un script tiers qui utilise le Shebang #!/usr/bin/env python.

Selon la documentation python, c'est la forme correcte pour les scripts qui conviennent à la fois Python v2 et Python v3 ( https://docs.python.org/3/using/windows.html#Shebang-lines ).

Mon Ubuntu (WSL) a seulement Python 3 installé:

~❯ which python
~❯ which python3
/usr/bin/python3

J'ai ajouté ceci au chemin, en ajoutant ce qui suit dans mon ~/.bashrc Et en le sélectionnant

export PATH=/usr/bin/python3:${PATH}
export PY_PYTHON=3  # also added this for good measure, but no joy
~❯ . ~/.bashrc
~❯ env | grep PATH
PATH=/home/me/.local/bin:/home/me/bin:/usr/bin/python3:/opt/gradle/gradle-5.3.1/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

Pourtant, lorsque j'exécute ce script, il se plaint de ne pas trouver Python. J'ai créé un court fichier de test foo qui contient le même Shebang et une print("Hello"):

~❯ ./foo
/usr/bin/env: ‘python’: No such file or directory

Que puis-je faire d'autre pour que env utilise python3?

PS: Je n'ai pas python 2, ni ne souhaite l'installer. Le script tiers README mentionne spécifiquement la prise en charge des deux Python v2 et v3, et le Shebang l'indique, comme mentionné, selon les documents Python eux-mêmes.

PPS: l'ajout d'alias ne résout pas ce problème car ils ne sont efficaces que lorsque l'utilisateur appelle python à l'invite, pas lorsque le bash lui-même exécute un script. Cette réponse à une question similaire cite explicitement ce comportement: https://askubuntu.com/a/351380/3331

PPPS: La sagesse reçue des autres questions est que la liaison symbolique n'est pas la bonne solution aux problèmes de env (ne pas avoir de lien à portée de main uniquement ATM)

3
Toby

Puisque OP n'installe pas python2 et n'a pas besoin de/usr/bin/python comme python2, je suis surpris que personne n'ait mentionné la solution la plus simple.

Vous avez juste un lien symbolique python vers python3 avec Sudo ln -s python3 /usr/bin/python, et cela fonctionnera.

Ou, configurez les alternatives comme mentionné dans le commentaire (3.6 si vous utilisez Ubuntu 18.04 sur WSL):

Sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.6 100
3
Alvin Liang

env ne peut pas trouver python parce que env recherche python dans votre PATH, pas sur n'importe quel shell intégré, ou alias ou Comme vous avez défini python comme utilisant EXPORT env ne le trouvera pas, il cherchera à travers 'PATH' et résoudra python = vers/usr/bin/python (qui est python2 et n'est pas présent dans le système).

Vous pouvez vérifier tous les emplacements disponibles de python exécutable, en bash, faites:

type -a python

Vous n'avez pas de chance si vous souhaitez utiliser un alias dans Shebang car par définition, Shebang doit être un chemin complet vers l'exécutable de l'interpréteur, que l'env devrait résoudre python pour quand vous utilisez /usr/bin/env python. Pour interpréter le script en utilisant python3, utilisez le Shebang:

#!/usr/bin/env python3
1
Tejas Lotlikar