S
S
sergeyy2018-12-05 11:38:12
Python
sergeyy, 2018-12-05 11:38:12

What am I doing wrong with proc.stdout.read()?

I want to make a bot according to this example
home-smart-home.ru/telegram-bot-raspberry-pi-signa...
created 2 files
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

so where does this b'' come from and why is the number 10 not read?

Answer the question

In order to leave comments, you need to log in

2 answer(s)
S
sSergeYy, 2018-12-06
@sergeyy

in general, my t11_temp.py looks like this

#Считывание температуры из датчика 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

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

Maybe I just didn’t have enough experience, but as I didn’t twist that subprocess method, I couldn’t do anything, and proc.stderr.read() gave errors 126 and 127, but I still didn’t understand how to do it right.
Thanks for the advice!

L
lega, 2018-12-05
@lega

blocking option py-my.ru/post/4bfb3c691d41c846bc000061
async option py-my.ru/2018/05/01/asyncio_subprocess.html
> ['%s' %file_read_temp], shell=True
1) list and shell=True, - you need to use one thing, either a list or a string + shell=True
2) the expression must be executable
3) see proc.stderr.read() what error it gives, or you can redirect stderr->stdout, it can also check that in proc.returncode

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question