Запуск сторонньої програми в Django

Це доволі таки специфічна задача, але може комусь згодитися. Ідея в тому, щоб з 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()


Коду потрібне доопрацювання, але ідея зрозуміла.
  • +3
  • 16 березня 2010, 20:01
  • theasus

Коментарі (2)

RSS згорнути / розгорнути
+
0
Те, що може з'явитись потреба в Django запустити сторонню консольну програму досить природно. Я, наприклад, за допомогою сторонньої ffmpeg генерую preview для завантаженого користувачем відео.
А от для чого з Django(який працює на сервері) може знадобитись запуск графічної програми(на тому ж сервері)?
avatar

sv0

  • 27 квітня 2010, 09:33
+
0
Запуск зовнішніх програм (функцій) тісно сплетений з необхідністю контролю їх виконання, можливості його повторити/відмінити у разі невдачі, мати realtime статус виконання. Є ще деякі специфічні міркування на тему масштабування ваших обчислювальних можливостей.
Зверніть вашу увагу на можливість застосування сервера черг (щоб уникнути задухи сервера на якому проводяться обчислення), та на інтегровані продукти на зразок celery
( ask.github.com/celery/getting-started/introduction.html )
avatar

alogvinenko

  • 28 квітня 2010, 13:59

Тільки зареєстровані й авторизовані користувачі можуть залишати коментарі.