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的作品,但我需要它来获得python在PATH支持虚拟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的路径,对吧?
Lar*_*Cai 22
最好使用环境变量来启用它.请参阅python doc:http://docs.python.org/2/using/cmdline.html
对于你的情况:
export PYTHONUNBUFFERED=1
script.py
Run Code Online (Sandbox Code Playgroud)
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
这是/ 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上测试过.
小智 7
这可能有点过时,但env(1)手册告诉人可以使用'-S'来表示这种情况
#!/usr/bin/env -S python -u
Run Code Online (Sandbox Code Playgroud)
它似乎在FreeBSD上运行得很好.
这是一个kludge,需要bash,但它的工作原理:
#!/bin/bash
python -u <(cat <<"EOF"
# Your script here
print "Hello world"
EOF
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20273 次 |
| 最近记录: |