我尝试将一个字符串从 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
实际上只能返回数值 - 退出状态,这些值在函数或源脚本的上下文中具有意义。来源dash
return
man 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'