Найти - Пользователи
Полная версия: скрипт питон выполняется как cgi на apache
Начало » Python для новичков » скрипт питон выполняется как cgi на apache
1
paq47
Здравствуйте, возможно ошибусь разделом (тогда прошу перенести), но я новичок в программировании на питоне и поэтому пишу тут.

Есть Ubuntu 12.04, Python 2.7.3, Apache/2.2.22 в составе LAMP сервера. Надо сделать чтобы из веб странички пользователь мог отправлять и принимать данные с ком порта. Решено было взять питон. Апач настраивать долго не пришлось - он уже умеет питон скрипты выполнять. Все уже настроено - страничка работает, скрипты в cgi папке и т д . скрипт выполняется по протоколу cgi.
скрипт простенький:

#!/usr/bin/env python

import serial
import cgi
import cgitb
import os
import sys

print (“STATUS: 200 OK\n\n”)
req = cgi.FieldStorage();
getdata = req.getvalue('c')
ser = serial.Serial('/dev/ttyACM0',9600,dsrdtr = 1,timeout = 0)
ser.open()
portisopen = ser.isOpen()
print(portisopen)
print(getdata)
ser.write(getdata)
readline = ser.readline()
print(readline)
ser.close()

создаем файл с расширением .py и в консольке делаем его исполняемым sudo chmod +x file.py …
из веб странички приходят данные (по средствам get или post jquery), затем все отправляется на виртуальный ком порт …

Скрипт не совсем корректно работает (данные теряет или вообще криво выполняется - данные на ком приходят но не те, что посылались). Еще данные с ком порта не приходят или искажаются. Если параллельно со скриптом открыть монитор порта (прога для общения с ком портом) то все работает как надо но данные прочитанные с ком порта приходят в прогу, а не на веб страничку.
Также часто виртуальный порт не работает из-за прав (делаю ему sudo chmod 777 -R /dev/ttyACM0 )
все работает, но не долго через перезагрузку снова может права затребовать….

вот кусочек лога ошибок апача, когда есть проблемы с правами:
Traceback (most recent call last):, referer: http://127.0.0.1/
File “/home/kain/www/cgi/py.py”, line 12, in <module>, referer: http://127.0.0.1/
ser = serial.Serial('/dev/ttyACM0',9600,dsrdtr = 1,timeout = 0), referer: http://127.0.0.1/
File “/usr/local/lib/python2.7/dist-packages/serial/serialutil.py”, line 260, in __init__, referer: http://127.0.0.1/
self.open(), referer: http://127.0.0.1/
File “/usr/local/lib/python2.7/dist-packages/serial/serialposix.py”, line 276, in open, referer: http://127.0.0.1/
raise SerialException(“could not open port %s: %s” % (self._port, msg)), referer: http://127.0.0.1/
serial.serialutil.SerialException: could not open port /dev/ttyACM0: Permission denied: ‘/dev/ttyACM0’, referer: http://127.0.0.1/

Собственно html страничка:
<!DOCTYPE html>
<html>
<head>
<title>HTML python test</title>
</head>
<body>
<h1>HTML python test</h1>
<script src=“jquery-1.9.1.min.js”>
</script>

<script>
var Com = function(command, callback, data){
$.get('http://10.42.0.1/cgi/py.py',{
c:command
}, callback);
function callback(data)
{
alert(data);
}

}
</script>
<button onclick=“Com(0)”>COM = 0;</button>
<button onclick=“Com(1)”>COM = 1;</button>
</body>
</html>


Если запустить скрипт в ipython то все работает как надо! пробовал с более простым скриптом:

#!/usr/bin/env python

import serial

print (“STATUS: 200 OK\n\n”)
ser = serial.Serial('/dev/ttyACM0',9600,dsrdtr = 1,timeout = 0)
ser.open()
portisopen = ser.isOpen()
print(portisopen)
print(getdata)
ser.write(1)
readline = ser.readline()
print(readline)
ser.close()

Он аналогичен, но работает. Еще пробовал openCV (чей-то проект с хабра,кажется) тоже через ipython работает, просто как скрипт нет.

Вопросы:
1) что не так?
2) как сделать, чтобы скрипт выполнялся через ipython?
3) почему через ipython все работает, а через стандартный shell питона нет?
4) возможно скрипт кривой, или я чего не понял?
5) у кого есть опыт работы с pySerial, подскажите…
6) простите, но я не умею под кат прятать ( если кто научит спрячу код под кат)
JOHN_16
paq47
Также часто виртуальный порт не работает из-за прав (делаю ему sudo chmod 777 -R /dev/ttyACM0 )
все работает, но не долго через перезагрузку снова может права затребовать….
пользователь должен входить в группу, например если есть
crw-rw—- 1 root tty 204, 64 Mar 14 13:17 /dev/ttyAMA0
то пользователь кто запускает (в вашем случае наверное кто т освязанный с веб сервером, www, wwwrun и тп) должен входить в группу tty

paq47
5) у кого есть опыт работы с pySerial, подскажите…
есть, но как то из ваших “многобукаф” не совсем ясно. Разделите все ваши проблемы на категории, и проверяйте каждый элемент системы отдельно.
paq47
А как проверить в какой группе пользователь?
Как переместить пользователя в нужную группу или расшарить ему права пользования КОМ портами?
JOHN_16
paq47
то есть вы в Linux не разбираетесь даже на уровне начинающего пользователя? тернистен ваш путь будет
sudo ls -l /dev/ttyACM0
это покажет к какой группе принадлежит нужное вам устройство. Затем либо через какое то прилоежение Убунты, либо через консоль добавьте пользовател от которого запускается скрипт в группу.
Например если польователь wwwrun а группа tty, то отредактируйте файл:
sudo vim /etc/group
Змените стрчоку подобным образом
tty:x:5:wwwrun
Перелогиньтесь или перезагрузитесь. Если выше перечисленное может в Ubuntu несколько отличаться, то гугл вам в помощь.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB