- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有一些 python-2.x 脚本,我在不同的系统、Debian 和 Arch linux 之间复制它们。Debian 将 python 安装为“/usr/bin/python”,而 Arch 将其安装为“/usr/bin/python2”。一个问题是在 Arch linux 上也存在引用 python-3.x 的 '/usr/bin/python'。因此,每次我复制一个文件时,我都必须更正 shebang 行,这有点烦人。
我在 Arch 上使用
#!/usr/bin/env python2
在 debian 上我有
#!/usr/bin/env python
由于 Debian 上不存在 'python2',有没有办法通过首选应用程序?也许有一些外壳扩展?例如,我不介意它是否依赖于现有的 '/bin/sh'。以下会很好,但不起作用。
#!/usr/bin/env python2 python
#!/usr/bin/env python{2,}
#!/bin/sh python{2,}
#!/bin/sh -c python{2,}
令人沮丧的是 'sh -c python{2,}' 在命令行上运行:即它在可用的地方调用 python2,否则调用 python。
我不希望在 Debian 上创建链接“python2->python”,因为如果我将脚本交给其他人,它就不会运行。我也不想让“python”指向 Arch 上的 python2,因为它随着更新而中断。
有没有一种不用编写包装器就可以做到这一点的干净方法?
我意识到之前有人问过类似的问题,但我没有看到任何符合我的边界条件的答案:) Conditional shebang line for different versions of Python
---更新
我拼凑了一个丑陋的 shell 解决方案,目前可以完成这项工作。
#!/bin/bash
pfound=false; v0=2; v1=6
for p in /{usr/,}bin/python*; do
v=($(python -V 2>&1 | cut -c 7- | sed 's/\./ /g'))
if [[ ${v[0]} -eq $v0 && ${v[1]} -eq $v1 ]]; then pfound=true; break; fi
done
if ! $pfound; then echo "no suitable python version (2.6.x) found."; exit 1; fi
$p - $* <<EOF
PYTHON SCRIPT GOES HERE
EOF
解释:获取版本号(v 是一个 bash 数组)并检查
v=($(python -V 2>&1 | cut -c 7- | sed 's/\./ /g'))
if [[ ${v[0]} -eq $v0 && ${v[1]} -eq $v1 ]]; then pfound=true; break; fi
使用来自标准输入 (-) 的输入启动找到的程序 $p 并传递参数 ($*)
$p - $* <<EOF
...
EOF
最佳答案
#!/bin/sh
''''which python2 >/dev/null 2>&1 && exec python2 "$0" "$@" # '''
''''which python >/dev/null 2>&1 && exec python "$0" "$@" # '''
''''exec echo "Error: I can't find python anywhere" # '''
import sys
print sys.argv
这首先作为 shell 脚本运行。您可以将几乎任何 shell 代码放在 ''''
和 # '''
之间。此类代码将由 shell 执行。然后,当 python 在文件上运行时,python 将忽略这些行,因为它们看起来像 python 的三引号字符串。
shell 脚本测试二进制文件是否存在于 which python2 >/dev/null
路径中,如果存在则执行它(所有参数都在正确的位置)。有关更多信息,请参阅 Why does this snippet with a shebang #!/bin/sh and exec python inside 4 single quotes work?
注意:该行以四个 '
开头,第四个 '
和 shell 命令的开头之间必须没有空格(which
...)
关于python - shebang env首选python版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18993438/
我试图了解 perl 如何处理 shebang 行。 我曾经认为命令行“命令位置”中提到的任何解释器都会优先于 shebang 行中提到的解释器。例如,如果一个名为 demo 的可执行脚本看起来像这样
我无法获取 Gforth当我有 shebang 时运行在脚本的顶部,例如: #!/usr/bin/gforth : pinoke ." I'm a real boy!!! " pinoke Unix
考虑以下代码: #!/usr/bin/env python import sys print "Hello! I've got %r as input." % sys.stdin.read() 这是
我正在尝试在 CentOS 6 中运行 bash 脚本。如果没有 shebang header ,它就无法工作。但是,当我包含 shebang 时,它会显示一条错误消息! 这是一个名为 test.sh
我得到了一个正则表达式,它使用这个正则表达式代码删除了 bash 中的注释 '/^\#/d' 但它也删除了 #!这不应该是因为它不是评论标签而是 shebang 那么忽略#! 怎么办呢?在正则表达式中
我打算在 php 脚本中添加一个 shebang 行 #!/bin/env php 但我环顾四周,似乎人们并没有这样做。 http://github.com/zurb/foundation/blob/
是Shebang #! ,例如 #!/bin/sh 在 Linux 标准库或任何 The Open Group 标准或其他地方正式标准化的脚本可执行文件之前?如果是,请提供引用资料和详细信息。 注意:
与使用 set 在 shebang 行上传递给脚本的标志有关的行为是否存在差异?内置? 例如: #!/bin/bash -e # do stuff 对比 #!/bin/bash set -e # do
这个问题已经有答案了: Why do people write "#!/usr/bin/env python" on the first line of a Python script? (22 个回
$ cat hello.ml #!/usr/bin/env ocamlrun ocaml let rec main = print_string "Hello World!\n" $ ./hello.
我的电脑上有/bin/bash (3.2) 和/usr/local/bin/bash (4.0)。在 $PATH 环境变量中,bash 4.0 早于 bash 3.2。 在我的 bash 脚本 she
是否可以向文件添加 shebang 行,以便它引用远程计算机上的程序? 例如,我没有在我的本地机器上安装 wolframscript,但我在远程机器上安装了。所以不是 #!/usr/bin/env w
我有一个简单的 cli 将时间戳转换为人类可读的日期时间。出于某种原因,当我尝试调用它时,我改为从 imagemagick 调用 import 命令。 > ts 1400029200000 Versi
要使 Python 脚本在 Linux 和 bash 上可执行,可以使用 shebang #! /usr/bin/env python 作为脚本的第一行。如果这一行恰好以 Windows 风格的换行符
我不太擅长 bash,我尝试编写一个脚本来使用 openSSH 连接到我的所有交换机,以便进行一些配置。 我创建了一个包含所有 25 个交换机的数组,然后使用循环打开与每个交换机的 SSH 连接。 由
我在 django 生产环境中使用 PythonAnyhwere。我有一个应该按计划运行的脚本。 由于我在 virtualenv 中安装了 django,因此脚本开始如下 #!/usr/bin/env
我在 Solaris 环境中运行 Python 脚本时遇到以下问题。 看来我在 shebang 行上做了一些不正确的事情,但我无法判断这是 Python 3 问题还是命令行问题。 但我怀疑它与 she
要使 Python 脚本在 Linux 和 bash 上可执行,可以使用 shebang #! /usr/bin/env python 作为脚本的第一行。如果这一行恰好以 Windows 风格的换行符
我在一台 linux 机器上执行了下面的代码,它执行得很好,但是当我在另一台 linux 机器上执行时,它给出了如下错误 Error:( declaration is not correct --
我目前正在编写一个 awk 脚本,如下所示: #!/usr/bin/awk -f BEGIN { print "Starting extracting data" } { print
我是一名优秀的程序员,十分优秀!