我有一个shell脚本,它执行一个带有传递给它的arg的C二进制文件。当我手动运行shell脚本时,每次都按预期工作。
当我尝试通过check_output进行此操作时,有时它会起作用,但大部分时间都会失败并产生奇怪的结果。
运行check_output
的python#! /usr/bin/env python
import subprocess
def getWaterTemp():
return 4.06
def getPH():
temp=getWaterTemp()
ph = subprocess.check_output(["./getPH.sh", str(temp)])
ph = float(ph[1:5])
if ph>0.0:
return ph
if __name__ == '__main__':
print getPH()
getPH.sh
#!/bin/sh
ph=$(/home/pi/GrowControlBox/phtempset1.1 T,$1)
echo "$ph"
当我运行shell脚本时,它会返回一个值:
"'8.66'"
当我运行python时,有时会返回值,有时会返回:
ValueError: could not convert string to float: ?▒▒▒
此外,每次运行python时,它都会返回一个值,但不会设置传感器的温度。 (这发生在C二进制文件中)有时候,我必须多次运行才能设置传递的温度。但是在运行shell脚本时,它会设置temp,然后返回 期望值,每一次。
这是运行python时遇到的另一个随机错误:
Traceback (most recent call last):
File "./GrowControlBox.py", line 42, in <module>
print getPH()
File "./GrowControlBox.py", line 36, in getPH
ph = float(ph[1:5])
ValueError: could not convert string to float:
证明shell脚本独立工作,以及不同的C二进制文件,以检查从先前的shell脚本运行中是否正确设置了temp:
pi@jslayrpi ~/GrowControlBox $ ./getPH.sh 17.0
8.697
pi@jslayrpi ~/GrowControlBox $ ./getPH.sh 2.5
8.788
pi@jslayrpi ~/GrowControlBox $ ./getPH.sh 6.8
8.758
pi@jslayrpi ~/GrowControlBox $ ./getPH.sh 9.1
8.746
pi@jslayrpi ~/GrowControlBox $ ~/phtemp t
t
Reading: 1
Reading: 63
Reading: 84
Reading: 172
Reading: 57
Reading: 46
Reading: 48
Reading: 57
Reading: 0
Reading: 0
?T▒9.09
Status: 1
Reading: 1
Reading: 56
Reading: 46
Reading: 55
Reading: 52
Reading: 52
Reading: 0
Reading: 0
Reading: 0
Reading: 0
8.744
答案 0 :(得分:0)
您收到此错误是因为您尝试将字符串片段转换为浮点数。假设ph
的格式为"'8.66'"
且包含任意数量的小数位,请尝试以下操作:
#! /usr/bin/env python
import subprocess
def getWaterTemp():
return 4.06
def getPH():
temp = getWaterTemp()
ph = subprocess.check_output(["./getPH.sh", str(temp)])
ph = float(ph[1:-1]) # exclude quotations
if ph > 0.0:
return ph
if __name__ == '__main__':
print(getPH())