如何解决Raspberry Pi 4 python 代码不是从 php 运行的
我在 RaspberryPi 4 上有一个 python 代码。如果我从终端运行它,它可以正常工作,但如果我想从 php 代码运行它,它就不起作用。它有什么问题?为什么在终端中正确运行它,而不是从 php 运行?谢谢。
python 代码第 1 部分:
#!/usr/bin/python3
import os
import glob
import time
import board
import Adafruit_DHT
import urllib.request
from urllib.request import urlopen
from datetime import datetime
import socket
import re
import smtplib
from email.message import EmailMessage
#email
def email_alert(subject,body,to):
msg = EmailMessage()
msg.set_content(body)
msg['subject'] = subject
msg['to'] = to
user = "xyz@gmail.com"
msg['from'] = user
password = "abcdef"
server = smtplib.SMTP("smtp.gmail.com",587)
server.starttls()
server.login(user,password)
server.send_message(msg)
server.quit()
# DECLARATIONS
now = datetime.now() # Get time right now
timestamp = now.strftime("%Y-%m-%d-%H:%M:%S") # Format the timestamp
os.system('modprobe w1-gpio') # Adding 1-wire module to the kernel
os.system('modprobe w1-therm') # Adding 1-wire therm module
base_dir = '/sys/bus/w1/devices/' # Setting the base_dir
device_folder = glob.glob(base_dir + '28*')[0] # Check if a Dallas DS18B20 is connected
device_file = device_folder + '/w1_slave' # This file holds the temperature
#sensor_type = 11 #DHT sensor type 11/22
#sensor_pin = 7 #DHT sensor pin in GPIO
DHT_SENSOR = Adafruit_DHT.DHT11
DHT_PIN = 22 # = GPIO22; az alap a GPIO4
# Initial the dht device,with data pin connected to:
#dhtDevice = adafruit_dht.DHT11(board.D23)
python 代码第 2 部分:
# Function to read raw temperature from the DS18b20
# It opens the device_file (/w1_slave),and reads the content,then close the file
def read_temp_raw():
f = open(device_file,'r')
lines = f.readlines()
f.close()
return lines
# Function to read the temperature and format it to Celsius and Fahrenheit
def read_temp():
lines = read_temp_raw()
while lines[0].strip()[-3:] != 'YES':
time.sleep(0.2)
lines = read_temp_raw()
equal_pos = lines[1].find('t=')
if equal_pos != -1:
temp_string = lines[1][equal_pos+2:]
temp_c = float(temp_string) / 1000.0
global celsius
celsius = temp_c
temp_f = temp_c *9.0 / 5.0 + 32.0
return temp_c,temp_f
# Function that reads the humidity and temperature from the DHT11
# It only saves and use the humidity
#humidity = 75
def read_humidity():
global humidity
#global temperature
#humidity,temperature = Adafruit_DHT.read_retry(sensor_type,sensor_pin)
humidity,temperature = Adafruit_DHT.read_retry(DHT_SENSOR,DHT_PIN)
time.sleep(2)
while True:
if humidity is not None and temperature is not None:
#print ('Data from sensor is OK. Humidity= {0:0.1f} %'.format(humidity))
print("Temp={0:0.1f}*C Humidity={1:0.1f}%".format(temperature,humidity))
if humidity > 100:
read_humidity()
else:
break
else:
print ('Error getting data from DHT.')
# Function to get the local hostname
# It is used for identify the "senor" in the mySQL database
def get_host_name():
global local_hostname
local_hostname = socket.gethostname()
# Function that get the external IP-adress
def get_external_ip_address():
global external_ip
url = "http://checkip.dyndns.org" # This site return one line of text.
my_request = urlopen(url).read() # Read the URL
res = re.findall(b'\d{1,3}',my_request) # Search and findall integers in my_request
my_ip_list = list(map(int,res)) # Clean up the list
my_ip = str(my_ip_list)[1:-1] # Remove the square brackets
temp_ip = my_ip.replace(",",".") # Replace comma with periods
external_ip = temp_ip.replace(" ","") # Replace <space> with none-space
print ("External IP: " +external_ip) # Print the External IP address as xxx.xxx.xxx.xxx
# Function that actualle sends data and adds it to the database
def send_data():
print (timestamp) # For debug purpose
print (celsius) # For debug purpose
print (humidity) # For debug purpose
print (local_hostname) # For debug purpose
output = "http://example.com/rpi/add_temp.php?temp="+str(celsius) \
+"&humi="+str(humidity)+"&time="+str(timestamp)+"&sensor="+str(local_hostname)+"&ip=" \
+str(external_ip) # This is the string that is called by the urlopen
print (output) # For debug purpose
html = urlopen(output).read() # Actually performing the call
print (html) # For debug purpose
def main():
read_temp()
read_humidity()
get_host_name()
get_external_ip_address()
send_data()
#dhtDevice.exit()
#GPIO.cleanup()
email_alert("Hey","Hello World","xyz@gmail.com")
#email_alert("Hey","1234567891@vtext.com")
if __name__ == "__main__":
main()
php代码:
<?php
// define the GPIO pins for the motor ouptput (Note: PiFace pins start at 200)
$output = shell_exec('/var/www/html/ds18b20_dht_mysql_v01.py 2>&1');
echo "<pre>$output</pre>";
?>
我得到的错误信息:
Traceback (most recent call last):
File "/var/www/html/ds18b20_dht_mysql_v01.py",line 138,in
main()
File "/var/www/html/ds18b20_dht_mysql_v01.py",line 128,in main
read_humidity()
File "/var/www/html/ds18b20_dht_mysql_v01.py",line 82,in read_humidity
humidity,DHT_PIN)
File "/usr/local/lib/python3.7/dist-packages/Adafruit_DHT/common.py",line 94,in read_retry
humidity,temperature = read(sensor,pin,platform)
File "/usr/local/lib/python3.7/dist-packages/Adafruit_DHT/common.py",line 81,in read
return platform.read(sensor,pin)
File "/usr/local/lib/python3.7/dist-packages/Adafruit_DHT/Raspberry_Pi_2.py",line 34,in read
raise RuntimeError('Error accessing GPIO.')
RuntimeError: Error accessing GPIO.
我可以看出问题在于 DHT11 温度传感器代码。但我不明白为什么在终端中工作,为什么不在 php 中工作。
解决方法
在您的方法中, read_humity() 是对自身的调用。是导致循环引用...
,我尝试直接从 Android 运行这个 .py 文件。但它不起作用。 .py 文件位置是 /var/www/html/ 在 apache 服务器上
String command = "python3 http://192.168.1.49:8081/ds18b20_dht.py";
try {
Process p = Runtime.getRuntime().exec(command);
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(),"Error",Toast.LENGTH_LONG).show();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。