gpt4 book ai didi

python - 相对 shebang : How to write an executable script running portable interpreter which comes with it

转载 作者:太空狗 更新时间:2023-10-29 11:03:57 25 4
gpt4 key购买 nike

假设我们有一个程序/包,它带有自己的解释器和一组应该在执行时调用它的脚本(使用 shebang)。

假设我们希望保持它的可移植性,因此即使只是简单地复制到不同的位置(不同的机器)而不调用设置/安装或修改环境 (PATH),它仍能正常运行。不应为这些脚本混入系统解释器。

给定的约束排除了两种已知的方法,例如使用绝对路径的 shebang:

#!/usr/bin/python 

并在环境中搜索

#!/usr/bin/env python

单独的发射器看起来很难看,是 Not Acceptable 。

我找到了 shebang 限制的一个很好的总结,它描述了为什么 shebang 中的相对路径是无用的,并且不能有一个以上的参数给解释器:http://www.in-ulm.de/~mascheck/various/shebang/

而且我还找到了practical solutions对于大多数具有“多行 shebang”技巧的语言。它允许编写这样的脚本:

#!/bin/sh
"exec" "`dirname $0`/python2.7" "$0" "$@"
print copyright

但有时,我们不想使用这种方法扩展/修补依赖于 shebang 的现有脚本,以及解释器的绝对路径。例如。 Python 的 setup.py 支持 --executable 选项,它基本上允许为其生成的脚本指定 shebang 内容:

python setup.py build --executable=/opt/local/bin/python

因此,特别是,可以为 --executable= 指定什么以实现所需的可移植性?或者换句话说,因为我不想让这个问题对 Python 太具体...

问题

如何编写一个 shebang,它指定一个解释器,其路径相对于正在执行的脚本的位置?

最佳答案

直接写在 shebang 中的相对路径是相对于当前工作目录的,所以像 #!../bin/python2.7 这样的东西对任何其他工作目录都不起作用,除了少数.

既然操作系统不支持它,为什么不使用外部程序,比如使用env 来查找PATH。但我知道没有专门的程序可以根据参数计算相对路径并执行结果命令……除了 shell 本身和其他脚本引擎。

但是尝试在像这样的 shell 脚本中计算路径

#!/bin/sh -c '`dirname $0`/python2.7 $0'

不起作用,因为在 Linux 上 shebang 仅受一个参数的限制。这建议我寻找接受脚本作为命令行第一个参数并能够执行新进程的脚本引擎:

使用 AWK

#!/usr/bin/awk BEGIN{a=ARGV[1];sub(/[a-z_.]+$/,"python2.7",a);system(a"\t"ARGV[1])}

使用 Perl

#!/usr/bin/perl -e$_=$ARGV[0];exec(s/\w+$/python2.7/r,$_)

21 年 1 月 11 日更新:

使用更新的 env 实用程序:

$ env --version | grep env
env (GNU coreutils) 8.30
$ env --help
Usage: env [OPTION]... [-] [NAME=VALUE]... [COMMAND [ARG]...]
Set each NAME to VALUE in the environment and run COMMAND.

Mandatory arguments to long options are mandatory for short options too.
-i, --ignore-environment start with an empty environment
-0, --null end each output line with NUL, not newline
-u, --unset=NAME remove variable from the environment
-C, --chdir=DIR change working directory to DIR
-S, --split-string=S process and split S into separate arguments;
used to pass multiple arguments on shebang lines

因此,将 -S 传递给 env 即可完成工作

关于python - 相对 shebang : How to write an executable script running portable interpreter which comes with it,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33225082/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com