2017-01-04 6 views
1

Я делаю программу, которая создает отдельный питон веб-сервер, сервер существует:TkInter Окно замерзает после запуска сервера из скрипта

import os, sys 
from http.server import HTTPServer, CGIHTTPRequestHandler 

webdir = '.' 
port = 8000 
print('Server Now Running') 
os.chdir(webdir) 
srvraddr = (('' , port)) 
srvrobj = HTTPServer(srvraddr, CGIHTTPRequestHandler) 
srvrobj.serve_forever() 

, а затем оригинальная программа запускает этот сервер из командной строки:

def runServer(self): 
    os.system('Webserver.py') 

Все это делается с помощью кнопок в окне Tkinter. Когда эта функция вызывается, окно Tkinter замерзает, и следующая кнопка не может быть нажата (одна из них будет вытаскивать локальный файл html в Safari через сервер).

Я посмотрел вокруг, и это похоже, что я, возможно, потребуется многопоточность или что-то ...

Я остаюсь невежественный, как я бы об этом. При необходимости может предоставить больше моей оригинальной программы (это немного неуклюже).

Я ищу простое решение или, может быть, конкретную ссылку, чтобы получить направление в правильном направлении.

Очень новый (3 месяца) на Python, так что имейте это в виду.

+2

при запуске 'os.system', тогда он ждет, пока он не кончится. И таким образом 'mainloop' не может выполнять свою работу - получает событие key/mouse, отправляет виджеты, перерисовывает виджеты и т. Д. Вам нужен модуль' threading' или 'subprocess' для запуска сервера как отдельный поток/процесс, а затем' mainloop 'будет делать свою работу. – furas

+0

исследуя это сейчас ... не могли бы вы дать мне представление о том, как это будет выглядеть в этой программе? – peer

+0

[threading] (https://docs.python.org/3.5/library/threading.html) и [подпроцесс] (https://docs.python.org/3.5/library/subprocess.html) – furas

ответ

2

Использование subprocess

import subprocess 

s = subprocess.Popen(['Webserver.py']) 

или, может быть, нужно будет python начать сценарий

s = subprocess.Popen(['python', 'Webserver.py']) 

или вы можете запустить

s = subprocess.Popen(['python3', '-m', 'http.server', '--cgi', '8000']) 

, а затем вы можете остановить процесс

s.kill() 

  • Popen (без аргументов) shell=True ожидает аргумент в виде списка
  • после закрытия программы подпроцесса все еще работает, так что вы должны убить их, прежде чем закрыть программу.
+0

Полностью сработал !!! Это было невероятно легко. Вот моя новая функция: def runServer (self): \t \t nm = self.e2.получаем() \t \t FLD = "/ Пользователи/равный/температуры /" + self.e1.get() + "/" + нм + ".py" \t \t с = subprocess.Popen ([ 'python3', FLD]). e2 - имя файла веб-сервера, а e1 - созданная верхняя папка. Thanks Much – peer

+0

Теперь я хочу посмотреть, куда я должен поставить s.kill(). Помните, что я в окне Tkinter ... Мне нужно, чтобы сервер работал, пока программа не закрывается. – peer

+1

вы можете поместить 's.kill()' после 'mainloop()' - он будет выполнен после закрытия окна. Или, если у вас есть кнопка для закрытия окна, тогда назначьте функцию, которая выполняет 's.kill()' и 'window.destroy()' – furas

1

Поскольку код выхода вызываемой программы является возвращаемым значением функции os.system, программа блокируется до выключения вызываемой программы.

Вместо этого используйте вместо него блокировку subprocess.Popen.

+0

Итак, p = self.runServer, subprocess.Popen (p) ??? Я потерялся. Основы чтения потоковой передачи сейчас. Пример был бы неоценим. – peer