Форум сайта python.su
проблемма такая:
подключается клиент - запускаю программу через Popen
далее сразу выводится “start ok” и “close socket” - т.е. не ждет завершения запущенной программы,
НО! отключение клиента не происходит, клиент висит на связи до тех пор пока запущенная программа не отработает,
после завершения запущенной программы происходит разрыв соединения
нужно что-б отключение клиента было сразу после запуска приложения.
как быть?
# ... создаю сервер
conn, addr = sock.accept() # подключение клиента
import subprocess
subprocess.Popen(["ping","yanedex.ru"]) # запуск программы
print 'start ok'
conn.send('ok')
conn.close() # команда отключения от клиента
print 'close socket'
Отредактировано (Авг. 20, 2009 12:56:58)
Офлайн
пока решения нет, выкрутился тем что закрываю соединение до запуска приложения :)
Офлайн
Смотри os.fork + os.exec* или os.spawn* в винде
Офлайн
slivlenos.spawn не помогает
Смотри os.fork + os.exec* или os.spawn* в винде
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
import sys
import socket
g_ServLoop = 1
def toexec2():
import subprocess
subprocess.Popen('ping 127.0.0.1 -n 7', shell = True)
def toexec():
os.spawnv(os.P_NOWAIT,'c:\\windows\\system32\\ping.exe',['ping.exe','127.0.0.1','-n','7'])
try:
g_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
g_sock.bind(('', 11111))
g_sock.listen(10)
start = 1
except:
print u"Error start"
if start:
print u'Started ok'
while g_ServLoop:
conn, addr = g_sock.accept()
print addr
data = conn.recv(4096)
toexec()
conn.send('ok')
conn.close()
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
import sys
import socket
import time
print time.ctime()
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 11111))
s.send('common')
# recv data
data = ''
while 1:
buf = s.recv(16384)
if not len(buf):
break
data += buf
print data
except:
print 'Error socket'
print time.ctime()
Офлайн
poltergeist
Это всё-таки не баг, а фича. Причём не питона, а вообще. Попробую описать что происходит:
Если не запускать дочерний процесс, то соединение как надо разрывается и клиент благополучно выходит из цикла приёма данных получив свой законный “len(buf) == 0”, означающий разрыв соединения. При создании дочернего процесса ресурсы родительского процесса (все дескрипторы в юниксах, кроме 0, 1, 2, и все хэндлеры в винде) наследуются в дочернем процессе, поэтому сокет и не закрывается, пока дочерний процесс не умрёт или не освободит занятый ресурс. Чтобы всё работало как задумывалось, надо в subprocess.Popen передать дополнительный параметр close_fds=True.
Офлайн