93 votes

Impossible de passer un argument au python avec "#! / Usr / bin / env python"

J'avais besoin d'un script python directement exécutable, j'ai donc démarré le fichier avec #!/usr/bin/env python . Cependant, j'ai aussi besoin d'une sortie sans tampon, j'ai donc essayé #!/usr/bin/env python -u , mais cela échoue avec python -u: no such file or directory .

J'ai découvert que #/usr/bin/python -u fonctionnait, mais j'en ai besoin pour obtenir les python en PATH afin de prendre en charge les environnements virtuels env .

Quelles sont mes options?

44voto

Ade YU Points 1229

Dans certains environnements, env ne divise pas les arguments. Donc, votre env cherche "python -u" dans votre chemin. Nous pouvons utiliser sh pour contourner le problème. Remplacez votre shebang par les lignes de code suivantes et tout ira bien.

 #!/bin/sh
''''exec python -u -- "$0" ${1+"$@"} # '''
# vi: syntax=python
 

ps nous n'avons pas à nous soucier de la voie à suivre pour sh, non?

31voto

Larry Cai Points 2243

Il est préférable d'utiliser la variable d'environnement pour l'activer. Voir la documentation python: http://docs.python.org/2/using/cmdline.html

pour votre cas:

 export PYTHONUNBUFFERED="YOUR_SET"
script.py
 

16voto

Jimmy Hartzell Points 71

Lorsque vous utilisez shebang sous Linux, le reste de la ligne après le nom de l'interpréteur est interprété comme un seul argument. "python -u" est passé à "env" comme si vous aviez tapé: "/ usr / bin / env" python -u "". / usr / bin / env recherche un binaire appelé 'python -u', qui n'existe pas.

12voto

neuro Points 6590

Passer des arguments à la ligne shebang n'est pas standard et, comme vous l'avez expérimenté, ne fonctionne pas en combinaison avec env sous Linux. La solution avec bash consiste à utiliser la commande intégrée "set" pour définir les options requises. Je pense que vous pouvez faire de même pour définir une sortie stuff de stdin avec une commande python.

my2c

8voto

philwalk Points 81

Voici un script alternatif à / usr / bin / env, qui permet de passer des arguments sur la ligne de hachage, sur la base de / bin / bash et avec la restriction que les espaces ne sont pas autorisés dans le chemin de l’exécutable. Je l'appelle "envns" (env sans espaces):

 #!/bin/bash

ARGS=( $1 )  # separate $1 into multiple space-delimited arguments.
shift # consume $1

PROG=`which ${ARGS[0]}`
unset ARGS[0] # discard executable name

ARGS+=( "$@" ) # remainder of arguments preserved "as-is".
exec $PROG "${ARGS[@]}"
 

En supposant que ce script se trouve dans / usr / local / bin / envns, voici votre ligne shebang:

 #!/usr/local/bin/envns python -u
 

Testé sur Ubuntu 13.10 et cygwin x64.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X