无法使用"#!/ usr/bin/env python"将参数传递给python

Esk*_*kil 65 python arguments shebang

我需要一个可直接执行的python脚本,所以我用它启动了该文件#!/usr/bin/env python.但是,我也需要无缓冲输出,所以我试过#!/usr/bin/env python -u,但是失败了python -u: no such file or directory.

我发现#/usr/bin/python -u的作品,但我需要它来获得pythonPATH支持虚拟env环境.

我有什么选择?

Ade*_* YU 40

在某些环境中,env不会拆分参数.所以你的env正在你的路径中寻找"python -u".我们可以用sh来解决.用以下代码行替换你的shebang,一切都会好的.

#!/bin/sh
''''exec python -u -- "$0" ${1+"$@"} # '''
# vi: syntax=python
Run Code Online (Sandbox Code Playgroud)

ps我们不用担心sh的路径,对吧?

  • [`$ {1 +"$ @"}`hack](http://www.perl.com/doc/FMTEYEWTK/sh_dollar_at)可能至少20年没必要了:) (13认同)
  • 对于那些想知道这是如何工作的人:[为什么这个片段有效?](http://stackoverflow.com/q/17458528) (3认同)
  • 骇客也许是不必要的,但这不会造成任何伤害吗?知道这很有趣:-)我今天才了解它。无论如何,我认为`“ exec”“ python”“ -u”“-”“ $ 0”“ $ @”`可能更容易理解-是否有缺陷?(我认为这与“ 1+”黑客不兼容吗?) (2认同)
  • 我的方法有一个缺点。如果你想向 bash 传递一些复杂的东西,例如带有嵌套 ''' 或 '"' 的字符串,那么你的方法更可靠。这是一个有趣的问题!也许我的更容易理解,但你的更健壮。也许你的答案应该澄清它必须以 ''''exec` 开头,并且字符串必须以 '# '''' 结尾(在 '#' 之前有一个空格)。只要我们遵循这些规则,并且不要没有任何额外的三引号`'''`,你的方法是完美和灵活的。 (2认同)

Lar*_*Cai 22

最好使用环境变量来启用它.请参阅python doc:http://docs.python.org/2/using/cmdline.html

对于你的情况:

export PYTHONUNBUFFERED=1
script.py
Run Code Online (Sandbox Code Playgroud)

  • 每次重启都需要这样做吗? (2认同)

Jim*_*ell 15

当您在Linux上使用shebang时,解释器名称后面的整个行的其余部分将被解释为单个参数.将python -u被传递到env如同您键入:/usr/bin/env 'python -u'.在/usr/bin/env对二进制搜索叫python -u,它没有一个.


neu*_*uro 13

将参数传递给shebang行并不是标准的,因为您已经尝试过不能与Linux中的env结合使用.使用bash的解决方案是使用内置命令"set"来设置所需的选项.我认为您可以使用python命令设置无缓冲的stdin输出.

MY2C


phi*_*alk 9

这是/ usr/bin/env的替代脚本,它允许在hash-bang行上传递参数,基于/ bin/bash,并且限制在可执行路径中不允许使用空格.我称之为"envns"(env No Spaces):

#!/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[@]}"
Run Code Online (Sandbox Code Playgroud)

假设这个脚本位于/ usr/local/bin/envns,这是你的shebang行:

#!/usr/local/bin/envns python -u
Run Code Online (Sandbox Code Playgroud)

在Ubuntu 13.10和cygwin x64上测试过.

  • 这应该捆绑:) (2认同)

小智 7

这可能有点过时,但env(1)手册告诉人可以使用'-S'来表示这种情况

#!/usr/bin/env -S python -u
Run Code Online (Sandbox Code Playgroud)

它似乎在FreeBSD上运行得很好.

  • 好像`-S`选项特定于`env(1)`的BSD变体,但它很好知道 (5认同)
  • Linux 现在也有 `env -S` - 从 coreutils 8.30 [1](/sf/answers/3708596881/) 开始(可能需要一段时间才能出现在你附近的发行版上)。语义与 FreeBSD 的 `env(1)` 相同 - 为优秀功能的可移植性而欢呼。 (4认同)

img*_*x64 5

这是一个kludge,需要bash,但它的工作原理:

#!/bin/bash

python -u <(cat <<"EOF"
# Your script here
print "Hello world"
EOF
)
Run Code Online (Sandbox Code Playgroud)