2015-03-01 2 views
0

У меня есть сценарий оболочки, который выполняет двоичный код C с переданным ему аргументом. Когда я запускаю сценарий оболочки вручную, все работает так, как ожидалось, каждый раз.Python check_output не работает правильно

Когда я пытаюсь выполнить это через check_output, иногда он работает, но большую часть времени он терпит неудачу со странными результатами.

Питон, который запускает check_output

#! /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" 

Когда я запускаю скрипт возвращает значение, как, например:

"'8.66'" 

Когда я запустить python, иногда он возвращает значение, иногда он возвращает:

ValueError: could not convert string to float: ?▒▒▒ 

Также время от времени при запуске питона оно возвращает значение, но не будет устанавливать температуру для датчика. (Это происходит в двоичном файле C) Иногда мне приходится запускать его несколько раз, чтобы установить температуру, которая была передана. Но при запуске скрипта оболочки он будет устанавливать 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: 

Доказательство того, что сценарий оболочки работает сама по себе, а с другой C двоичном, чтобы проверить, что темп был установлен правильно от предыдущего shell script run:

[email protected] ~/GrowControlBox $ ./getPH.sh 17.0 
8.697 
[email protected] ~/GrowControlBox $ ./getPH.sh 2.5 
8.788 
[email protected] ~/GrowControlBox $ ./getPH.sh 6.8 
8.758 
[email protected] ~/GrowControlBox $ ./getPH.sh 9.1 
8.746 
[email protected] ~/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

Вы могли бы найти [это StackExchange] (http://raspberrypi.stackexchange.com/) полезно в будущем, а также , –

+0

Я активен там, но поскольку это действительно относится к просто python, я подумал, что лучше всего публиковать в регулярном переполнении стека – jslay

+0

. Какова цель 'ph [1: 5]'? Что * должен * вернуть? –

ответ

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()) 
+0

Это наверняка потерпит неудачу. Вся причина для ph [1: 5] заключается в удалении 'в начале строки ph, которая вызовет ValueError – jslay

+0

Возвращена ли строка ''' 8.66 '"'? @jslay –

+0

правильно, я имел в виду это буквально, говоря «8.66», я думаю, что, как вы его пишете, лучше понять, извините. – jslay