【问题标题】:python file has shell interpreter and python code - how it is interpretedpython文件有shell解释器和python代码——它是如何解释的
【发布时间】:2021-02-01 08:09:31
【问题描述】:

我遇到了thispython(.py) 文件,但它在第一行有 SHELL 解释器,但后面的行是 python 代码。

明明是python文件,为什么第一行有SHELL shebang呢

如果这是一个SHELL脚本,为什么文件有扩展名.py

如果这是SHELL脚本,下面的代码是如何被SHELL解释的。

#!/bin/sh
''''exec python -u -- "$0" ${1+"$@"} # '''
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: MIT-0
import json
import os

【问题讨论】:

    标签: python shell


    【解决方案1】:

    这样就完成了,看看下面这个脚本的扩展版本:

    #!/bin/sh
    ''''echo $0 "is called. Hello shell world: PARS:" ${1+"$@"} #'''
    ''''exec python -u -- "$0" ${1+"$@"} # '''
    # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
    # SPDX-License-Identifier: MIT-0
    import json
    import os
    import sys
    
    print "Hello python world", sys.argv
    

    Shrtoly:首先shell接管前几行,然后自己调用python解释器。

    '''' 之后的内容被 python 解释器忽略为多行注释:Is there a way to create multiline comments in Python? 因此它们被 shell 拾取,并且 shell 在 @987654324 行之后将控制权交给了 python 解释器@ 因此,python 会选择 $0 中的脚本(现在我们已经打印出来了),并根据 ${1+"$@"} 的所有参数提供传入参数的列表。

    从现在开始,python 可以对脚本做任何他想做的事情。

    【讨论】:

    • 为什么行首需要四个',而行尾只需要三个?有什么我想念的吗?
    • @FlyingTeller 四个' 将评估为两个'' 即。两个空字符串,它们将与 echo 连接,因此在 echo 之前什么都不提供(尝试运行 ''''echo ABC'X'echo ABC''echo ABC,看看哪个有效,哪个无效)。如果你有三个,那将是一个空字符串 '' 和另一个字符串: 'echo ....# 之后的部分被 shell 脚本忽略,因为它是一个注释,所以 bash 在末尾看不到 '''
    【解决方案2】:

    只是为了让开发人员注意它结合了 shell 和 python,他们将它作为 python 文件运行

    【讨论】:

    • 这很令人困惑,我会创建一个 .sh 文件并让它在那里调用 .py 文件。还有一篇解释 bash 位的帖子:stackoverflow.com/q/52785232/9824103
    • @hecohaf944 - 第 2 行开头有 4 个单引号,结尾有 3 个单引号 (''''exec python -u -- "$0" ${1+"$@" } # ''')。这是在 Shell 脚本中包含 python 代码的方式吗?
    • 是什么让你如此确定它是作为 python 文件运行的?有证据吗?
    • @intechops6 是的,您可以在 bash 终端中试用:exec python -u "filename"。您喜欢使用 $0,它将替换文件名。 $0 之后的所有内容都是参数,在这种情况下,什么都没有。 Python 也会认为 shell 行是注释。
    • @sleepystar96 现在知道了。将文件名读取为 $0 和脚本内的参数。将在终端中执行以更好地理解它。
    猜你喜欢
    • 2015-03-23
    • 2020-08-20
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 2012-12-18
    相关资源
    最近更新 更多