2013-09-13 2 views
2

В качестве дополнения к предыдущему сообщению, которое, к сожалению, похоже, умерло: select.select issue for sockets and pipes. Поскольку этот пост я пробовал разные вещи безрезультатно, и я хотел посмотреть, есть ли у кого-нибудь представление о том, где я ошибаюсь. Я использую модуль select(), чтобы идентифицировать, когда данные присутствуют ни в трубе, ни в сокете. Кажется, что сокет работает нормально, но труба оказывается проблематичной.select and Pipes trouble in Python

Я настроил трубу следующим образом:

pipe_name = 'testpipe' 
if not os.path.exists(pipe_name): 
    os.mkfifo(pipe_name) 

и считывающая труба:

pipein = open(pipe_name, 'r') 
line = pipein.readline()[:-1] 
pipein.close() 

Он отлично работает как самостоятельный кусок кода, но когда я пытаюсь связать его функции select.select она не:

inputdata,outputdata,exceptions = select.select([tcpCliSock,xxxx],[],[]) 

Я попытался ввода 'pipe_name', 'testpipe' и 'pipein' в inputdata, но я всегда получаю «неопределенную» ошибку. Глядя на различных других постах я думал, что это может быть потому, что труба не имеет идентификатора объекта, так что я пробовал:

pipein = os.open(pipe_name, 'r') 
fo = pipein.fileno() 

и положить «Ф.О.» в аргументах select.select но получил TypeError: целое число является требуется. У меня также был Ошибка 9: Плохой дескриптор файла при использовании этой конфигурации 'fo'. Любые идеи, что я сделал неправильно, будут оценены.

EDITED КОД: мне удалось найти способ ее решения, хотя и не уверен, что это особенно аккуратным - я был бы заинтересован в любом comments- установки После доработки трубы:

pipe_name = 'testpipe' 
pipein = os.open(pipe_name, os.O_RDONLY) 
if not os.path.exists(pipe_name): 
    os.mkfifo(pipe_name) 

Pipe Read:

def readPipe() 
    line = os.read(pipein, 1094) 
    if not line: 
     return 
    else: 
     print line 

Основной цикл для мониторинга событий:

inputdata, outputdata,exceptions = select.select([tcpCliSock,pipein],[],[]) 
if tcpCliSock in inputdata: 
    readTCP() #function and declarations not shown 
if pipein in inputdata: 
    readPipe() 

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

+0

Вы на коробке с окнами? Выбирайте только работы с сокетами там. –

+0

В исходном вопросе вы написали: «В настоящее время в трубке хранятся входящие данные из формы html, сокет составляет соединение с сервером, который отправляет команды TCP/IP с различными интервалами. Форма и сервер находятся в одной и той же локальной сети, но на разных компьютерах «. Именованные каналы (fifos) являются локальными для одной машины и не доступны из другого. Вы показали, что фило читали, но не писатель-филонор. Что-то не хватает в вашем вопросе. – msw

+0

Эй Спенсер, не Windows, удалось заставить его работать. – AimSkyward

ответ

2

Согласно docs, необходимо, чтобы файловый дескриптор от os.open или аналогичный. Таким образом, вы должны использовать команду select.select([pipein], [], []).

В качестве альтернативы вы можете использовать epoll, если вы находитесь в системе Linux.

poller = epoll.fromfd(pipein) 
events = poller.poll() 
for fileno, event in events: 
    if event is select.EPOLLIN: 
    print "We can read from", fileno 
+0

Привет, Спенсер, Спасибо за комментарий, прежде чем я его увижу, мне удалось найти способ сделать это, хотя он немного отличается от того, что вы рекомендовали. У меня был хороший взгляд на использование epoll, и это может быть так, как я заканчиваю так, как кажется довольно аккуратным. Если вы заинтересованы, я добавил редактирование на свое оригинальное сообщение, описывающее, что я сделал, меня бы интересовали ваши комментарии. еще раз спасибо – AimSkyward