Вызов urlopen из скрипта cgi, ошибка «соединение отказано» - PullRequest
0 голосов
/ 24 ноября 2010

У меня есть Python CGI-скрипт, который проверяет, является ли процесс активным, и запускает его, если этот процесс не найден.Сам процесс является веб-сервером (на основе web.py).Убедившись, что процесс запущен, я пытаюсь сделать URL-запрос к нему.Идея состоит в том, чтобы перенаправить результаты этого запроса инициатору моего скрипта cgi, в основном я хочу перенаправить запрос на локальный веб-сервер, который прослушивает другой порт.

Этот код работает нормально, если я запустилсначала сервер (findImgServerProcess возвращает True) из оболочки, не использующей запросы cgi.Но если я пытаюсь запустить процесс с помощью нижеприведенного cgi-скрипта, я получаю вызов до urllib2.urlopen, который выдает исключение, что в соединении отказано.Я не понимаю почему?Если я распечатываю список процессов (r в findImgServerProcess()), я вижу, что процесс там, но почему urllib2.urlopen выдает исключение?У меня есть веб-сервер apache2, настроенный для использования suexec.

Вот код:

#!/usr/bin/python
import cgi, cgitb
cgitb.enable()
import os, re
import sys
import subprocess

import urllib2
urlbase = "http://localhost:8080/getimage"
imgserver = "/home/martin/public_html/cgi-bin/stlimgservermirror.py" # this is based on web.py

def findImgServerProcess():
    r = subprocess.Popen(["ps", "aux"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT).communicate()[0]
    return re.match(".*%s" % os.path.split(imgserver)[-1], r, re.DOTALL)

def ensureImgServerProcess():
    if findImgServerProcess():
        return True

    os.environ['LD_LIBRARY_PATH'] = '/home/martin/lib'
    fout = open("/dev/null", "w")
    ferr = fout
    subprocess.Popen([sys.executable, imgserver], stdout=fout, stderr=subprocess.STDOUT)
    # now try and find the process
    return findImgServerProcess() != None

def main():
    if not ensureImgServerProcess():
        print "Content-type: text/plain\n"
        print "image server down!"
        return

    form = cgi.FieldStorage()
    if form.has_key("debug"):
        print "Content-type: text/plain\n"
        print os.environ['QUERY_STRING']
    else:
        try:
            img = urllib2.urlopen("%s?%s" % (urlbase, os.environ['QUERY_STRING'])).read()
        except Exception, e:
            print "Content-type: text/plain\n"
            print e
            sys.exit()
        print "Content-type: image/png\n"
        print img

if __name__ == "__main__":
    main()

1 Ответ

0 голосов
/ 25 ноября 2010

Возможно, у подпроцесса не было возможности полностью запуститься, прежде чем пытаться подключиться к нему.Чтобы проверить это, попробуйте добавить time.sleep (5) перед вызовом urlopen.

Это не идеально, но, по крайней мере, поможет вам понять, в этом ли проблема.В будущем вы, вероятно, захотите настроить лучший способ проверки работоспособности демона HTTP.

...