Це доволі таки специфічна задача, але може комусь згодитися. Ідея в тому, щоб з Django запустити графічну програму. Деталі — під катом.
Звісно, варіант
p = subprocess.Popen(com, shell = True, stderr = subprocess.PIPE, stdout = subprocess.PIPE, env=env,close_fds = True,cwd='/home/averrin')
return p.communicate()[0]
Може використовуватися лише для консольних програм і без шаманства працює від користувача www-data.
А щоб запустити щось більш серйозніше, треба нормальні права користувача та середовище. Для вирішення цієї проблеми був винайдений наступний спосіб: уже запущеній програмі-серверу по сокету передається команда, яка потім починає працювати тим же subprocess, але вже з правами, які вам потрібні. Вирішення цієї задачі не зовсім витончене, але тим не менш, воно працює.
Представлення Django:
HOST = "" # віддалений комп'ютер (localhost)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((HOST, PORT))
sock.send(com)
result = sock.recv(1024)
sock.close()
return result
Власне сервер:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import socket, string
import os, sys, subprocess
import random
def do(com):
p = subprocess.Popen(com, shell = True, stderr = subprocess.PIPE, stdout = subprocess.PIPE, close_fds = True,cwd='/home/averrin')
print p.communicate()[0]
return 'Success'
#os.system(com)
HOST = "" # localhost
PORT = 8800
srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
srv.bind((HOST, PORT))
while 1:
print "Слухаю порт %d" % PORT
srv.listen(1)
sock, addr = srv.accept()
while 1:
com = sock.recv(1024)
if not com:
break
print "Отримано від %s:%s:" % addr, com
try:
response=do(com)
except:
response='fail'
#print "Відправлено %s:%s:" % addr, lap
sock.send(response)
sock.close()
Коду потрібне доопрацювання, але ідея зрозуміла.
Коментарі (2)
RSS згорнути / розгорнутиА от для чого з Django(який працює на сервері) може знадобитись запуск графічної програми(на тому ж сервері)?
sv0
Зверніть вашу увагу на можливість застосування сервера черг (щоб уникнути задухи сервера на якому проводяться обчислення), та на інтегровані продукти на зразок celery
( )
alogvinenko
Тільки зареєстровані й авторизовані користувачі можуть залишати коментарі.