【问题标题】:shell script execute python code as shell scriptshell脚本将python代码作为shell脚本执行
【发布时间】:2021-04-12 00:41:21
【问题描述】:

我想使用 test.sh 执行 hello.py。但是,似乎 test.sh 将 hello.py 读取为 sh 文件。

错误信息

line 1: syntax error near unexpected token `'hello''

test.sh

#!/user/bin/ python (which python path)
ARRAY=(1 2 3 4)
for num in ${ARRAY[@]}; do
    /artic/m-yasunaga/work/korin-3/src/example/hi.py
    echo $num"th loop"
done

你好.py

print('hello')

当我将 print('hello') 更改为 echo hello 时,它运行良好。

如何将 hello.py 作为 python 代码执行? (我用的是linux)

【问题讨论】:

  • 你的 python 脚本需要一个 shebang 行(见this question)。此外,你的 shell 脚本应该有一个 shell shebang,而不是一个引用 python(并且它不能包含括号注释,也不能在路径中间包含空格)。启动脚本的 shebang 行指示如何运行 该脚本,而不是它可能运行的其他脚本。当您像这样直接运行脚本时,会忽略文件扩展名(如 .sh 或 .py)。
  • 实际上,由于您的 shell 脚本使用数组(这是一个 bash 扩展,在所有其他 shell 中都不可用),因此您应该使用 bash shebang(如 #!/bin/bash#!/usr/bin/env bash),而不是一个通用的 shell shebang(比如#!/bin/sh)。
  • /user/bin/ python?这……很奇怪。试试/usr/bin/python
  • @JennyRowland :添加到 Pursell 的评论中,您的脚本是 Shell,而不是 Python。尝试为 Python 构建 #!-line 更加奇怪......

标签: python linux bash shell


【解决方案1】:

您的脚本中有一些语法错误等.....试试这个:

创建以下两个脚本。

名称:test.sh

#!/usr/bin/env bash
ARRAY=(1 2 3 4)
for num in ${ARRAY[@]}; do
    ./hello.py
    echo $num"th loop"
done

名称:hello.py

#!/usr/bin/env python
print('hello')

从你的命令行,运行以下命令

chmod 700 test.sh ;  chmod 700 hello.py

现在可以从命令行运行:

./test.sh

输出将是:

>./test.sh 
hello
1th loop
hello
2th loop
hello
3th loop
hello
4th loop

【讨论】:

  • 这里无关紧要,但我还建议双引号引用变量引用(for num in "${ARRAY[@]}"; doecho "${num}th loop")。
【解决方案2】:

你应该提到python路径

#!/user/bin/ python (which python path)

在 hello.py 文件中并使用它使其可执行

chmod +x hello.py

现在您可以将其用作可执行文件。

【讨论】:

    最近更新 更多