Найти - Пользователи
Полная версия: запуск программы без ожидания её завершения
Начало » Python для новичков » запуск программы без ожидания её завершения
1
o7412369815963
проблемма такая:

подключается клиент - запускаю программу через 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'
Python26 Win
перебрал разные ф-ии ничего не помогло, пока вижу один выход - потоки
o7412369815963
пока решения нет, выкрутился тем что закрываю соединение до запуска приложения :)
slivlen
Смотри os.fork + os.exec* или os.spawn* в винде
o7412369815963
slivlen
Смотри os.fork + os.exec* или os.spawn* в винде
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()
o7412369815963
poltergeist
Это всё-таки не баг, а фича. Причём не питона, а вообще. Попробую описать что происходит:
Если не запускать дочерний процесс, то соединение как надо разрывается и клиент благополучно выходит из цикла приёма данных получив свой законный “len(buf) == 0”, означающий разрыв соединения. При создании дочернего процесса ресурсы родительского процесса (все дескрипторы в юниксах, кроме 0, 1, 2, и все хэндлеры в винде) наследуются в дочернем процессе, поэтому сокет и не закрывается, пока дочерний процесс не умрёт или не освободит занятый ресурс. Чтобы всё работало как задумывалось, надо в subprocess.Popen передать дополнительный параметр close_fds=True.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB