Задать вопрос
@sSergeYy

Что я делаю не так с proc.stdout.read()?

хочу сделать бота по этому примеру
home-smart-home.ru/telegram-bot-raspberry-pi-signa...

создал 2 файла
1)t11_temp.py
#Считывание температуры из t11
import Adafruit_DHT
import time

#temp_pin = 9
#tempe = Adafruit_DHT.DHT11
#humidity, temperature = Adafruit_DHT.read_retry(tempe, temp_pin)
#time.sleep(0.3)

#cTemp = temperature
cTemp = 10
print "%.2f" %cTemp


2) bot.py
import subprocess
from subprocess import Popen, PIPE
import sys,os
import asyncio
import telepot
import telepot.aio
from telepot.namedtuple import ReplyKeyboardMarkup, KeyboardButton, ReplyKeyboardRemove, ForceReply
from telepot.namedtuple import InlineKeyboardMarkup, InlineKeyboardButton
from telepot.namedtuple import InlineQueryResultArticle, InlineQueryResultPhoto, InputTextMessageContent


#Тут должны находиться ваши айдишники (для примера я сделал 2 разрешенных)
#Вы можете запустить бота и увидеть при нажатии меню или /start ваш личный айдишник
#Ваши разрешенные айди нужно прописать в переменных chat_allow, заменив None на айдишники 
#chat_allow1=123456789
chat_allow2=987654321


# Ниже пути расположения скриптов чтения значений датчиков и управление реле.
# Каждый файл - исполняемый питоновский скрипт. 
# Необходимо чтобы все файлы были представлены в системе и были исполняемыми.
file_read_temp = '/home/pi/t11_temp.py'

# считывание температуры из скрипта для t11
def temp_read():
	proc = Popen(['%s' %file_read_temp], shell=True, stdout=PIPE, stderr=PIPE)
	proc.wait()
	t = proc.stdout.read() #здесь должно вернуться число 10 из скрипта
        print (t) # но на экране вместо числа 10 появляется b''
	#t = float(t)
	return t

так вот откуда берется это b'' и почему не считывается число 10?
  • Вопрос задан
  • 517 просмотров
Подписаться 2 Простой 3 комментария
Решения вопроса 1
@sSergeYy Автор вопроса
в общем t11_temp.py у меня выглядит так
#Считывание температуры из датчика t11
import Adafruit_DHT
import time
temp_pin = 9
tempe = Adafruit_DHT.DHT11
humidity, temperature = Adafruit_DHT.read_retry(tempe, temp_pin)
time.sleep(0.3)
def temp():
    t = '{0:0.1f}*'.format(temperature)   #сюда записывается температура с датчика
   # print "%.2f" %t
    return t
def hum():
    h = '{1:0.1f}%'.format(humidity)    #а тут влажность
    print (h)
    return h


а файл bot.py так
def temp_read():
        import t11_temp
        t = t11_temp.temp() #исполняет def temp из первого файла и присваивает возвращенную переменную t 
        return t
t = temp_read


Возможно мне просто опыта не хватило, но как я не крутил тот метод subprocess у меня нечего не получалось, а proc.stderr.read() выдавал ошибку 126 и 127, но я так и не понял как сделать правильно.
Спасибо за советы!
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@lega
блокирующий вариант py-my.ru/post/4bfb3c691d41c846bc000061
async вариант py-my.ru/2018/05/01/asyncio_subprocess.html

> ['%s' %file_read_temp], shell=True
1) список и shell=True, - нужно использовать что-то одно, либо список, либо строка + shell=True
2) выражение должно быть запускаемым
3) см. proc.stderr.read() какую ошибку выдает, либо можно перенаправить stderr->stdout, так же может проверить что в proc.returncode
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы