从 shell 返回值给 Python 脚本

从 shell 返回值给 Python 脚本

我尝试将一个字符串从 shell 脚本返回到 python,但出现以下错误。

./whiptail.sh: 10: return: Illegal number: uuiiu

我尝试使用 subprocess.Popen 直接在 python 中运行 whiptail 命令,但那时我无法读取来自 python 的用户输入。如果有人尝试过这个,请告诉我如何解决这个问题。

shell 脚本片段

#!/bin/sh


COLOR=$(whiptail --inputbox "What is your favorite Color?" 8 78 Blue --title "Example Dialog" 3>&1 1>&2 2>&3)
                                                                        # A trick to swap stdout and stderr.
# Again, you can pack this inside if, but it seems really long for some 80-col terminal users.
exitstatus=$?
if [ $exitstatus = 0 ]; then
    echo "User selected Ok and entered " $COLOR
    return $COLOR
else
    echo "User selected Cancel."
fi

echo "(Exit status was $exitstatus)"

答案1

在Ubuntu 上,内置命令sh实际上只能返回数值 - 退出状态,这些值在函数或源脚本的上下文中具有意义。来源dashreturnman sh

返回命令的语法是

return [exitstatus]

echo $COLOR您的 shell 脚本中的其他所有内容看起来都是正确的。我认为您需要使用返回并抑制其他回声。

如果你需要向主脚本返回更多数据,你可以将所有内容输出为一行,然后将单独的字段 通过一些字符,这些字符将在主脚本中充当分隔符的作用,在此基础上,您可以将字符串转换为数组。例如(其中,是我们的分隔符,-n并将替换为换行符echo):

echo -n "$COLOR","$exitstatus"

脚本提供的但主脚本不需要的其他信息可以重定向到某些日志文件:

$ cat whiptail.sh
#!/bin/sh
log_file='/tmp/my.log'

COLOR=$(whiptail --inputbox "What is your favorite Color?" 8 78 Blue --title "Example Dialog" 3>&1 1>&2 2>&3)
exitstatus=$?

if [ $exitstatus = 0 ]; then
    echo "User selected Ok and entered $COLOR" > "$log_file"
    echo -n "$COLOR","$exitstatus"
else
    echo "User selected Cancel."  >> "$log_file"
    echo -n "CANCEL","$exitstatus"
fi

不幸的是,我对 Python 没有什么经验,但这里有一个示例 .py 脚本,可以处理上述 .sh 脚本的输出(参考):

$ cat main-script.py
#!/usr/bin/python
import subprocess

p = subprocess.Popen(['./whiptail.sh'], stdout=subprocess.PIPE)
p = p.communicate()[0]
p = p.split(",")
print "Color:    " + p[0]
print "ExitCode: " + p[1]

答案2

我遇到了类似的问题,我需要 Python 脚本中 shell 命令的返回值。

subprocess方法check_output()帮助我将 shell 返回代码作为 Python 文件中的字节字符串获取。

以下是代码:

return_value =subprocess.check_output("sudo raspi-config nonint get_spi", stderr=subprocess.STDOUT, shell = True)
print(return_value)


<<<b'1\n'

相关内容