![](/img/trans.png)
[英]Failed to run sudo killall python from php script in raspberry pi 2 ver B
[英]Raspberry Pi 4 python code not run from 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", "Hello World", "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, temperature = Adafruit_DHT.read_retry(DHT_SENSOR, 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_humidity() 是對自身的調用。 是導致循環引用...
我嘗試直接從 Android 運行 this.py 文件。 但它不起作用。 .py 文件位置是 apache 服務器上的 /var/www/html/
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();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.