【问题标题】:Mixed shell and python script possible?可以混合 shell 和 python 脚本吗?
【发布时间】:2012-03-05 23:30:10
【问题描述】:

我发誓我以前看过这个,但现在找不到了。是否可以让一个 shell 脚本启动一个 python 解释器“中流”,即:

#!/bin/bash
#shell stuff..

set +e

VAR=aabb

for i in a b c; do
    echo $i
done

# same file!

#!/usr/bin/env python
# python would be given this fd which has been seek'd to this point

import sys

print ("xyzzy")

sys.exit(0)

【问题讨论】:

    标签: python linux shell


    【解决方案1】:

    你可以使用这个shell语法(在Unix文献中称为here document):

    #!/bin/sh
    echo this is a shell script
    
    python <<@@
    print 'hello from Python!'
    @@
    

    '

    【讨论】:

      【解决方案2】:

      如果您的python 脚本很短。您可以使用-c 选项将其作为字符串传递给python

      python -c 'import sys; print "xyzzy"; sys.exit(0)'
      

      或者

      python -c '
      import sys
      print("xyzzy")
      sys.exit(0)
      '
      

      【讨论】:

        【解决方案3】:

        你可以写

        exec python <<END_OF_PYTHON
        
        import sys
        
        print ("xyzzy")
        
        sys.exit(0)
        END_OF_PYTHON
        

        用 Python 替换 Bash 进程并将指定的程序在其标准输入上传递给 Python。 (exec 替换了 Bash 进程。&lt;&lt;END_OF_PYTHON 导致标准输入包含直到 END_OF_PYTHON 的所有内容。)

        【讨论】:

        • +1:因为执行优于仅调用 python。在这种情况下,shebang 是不必要的,将仅被视为评论。
        • @WilliamPursell:你知道,我什至没有注意到 shebang 。 . .它不仅没有必要,而且实际上具有误导性,因为这不会调用env。我想命令可能是exec env python &lt;&lt;END_OF_PYTHON,但最好只是删除shebang。
        【解决方案4】:

        当然,在我发布这个之后,我就想起了一种方法:

        #!/bin/sh
        
        echo Shell
        
        python <<EOF
        
        import sys
        
        print "Python"
        
        sys.exit(0)
        
        EOF
        

        【讨论】:

          【解决方案5】:

          我同意混合/混搭可能是一种非常强大的技术 - 不仅在脚本中,而且在命令行中(例如,perl 内联器已被证明随着时间的推移非常成功)。所以我的小提示是关于在 bash/python 中混合脚本的另一种单行代码(除了 kev 提到的):

          for VAR in $(echo 'import sys; print "x y z"; sys.exit(0)' | python -);do echo "$VAR"; done;
          

          生产

          x
          y
          z
          

          【讨论】:

            猜你喜欢
            • 2012-10-16
            • 2016-10-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-03-16
            • 2020-12-28
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多