2013-04-25 2 views
0

Мне нужна помощь, чтобы получить результат из pycurl, который я пытаюсь запустить в подпроцессе. Этот вывод я пытаюсь поставить в очередь и вытащить эту очередь из другого класса.Подпроцесс pycurl в отдельной теме

, к сожалению, сейчас я не имею выход = (

import threading 
import random 
import time 
import Queue 
import urllib2 
import sys 
import simplejson, pycurl 
import sys, signal 

queue = Queue.Queue() 
keep_running = True 
user = "username" 
pswd = "pass" 

class MyThread(threading.Thread): 
    def __init__(self, queue): 
     threading.Thread.__init__(self) 
     self.queue = queue 

    def run(self): 
     curl_path = '/usr/bin/curl' 
     curl_list = [curl_path] 
     args = ('curl', 'https://stream.twitter.com/1/statuses/filter.json?track=java', '-u', 'user:pass') 
     for arg in args: 
      curl_list.append(arg) 
      child = subprocess.Popen(
         curl_list, 
         shell=False, 
         #stdout=subprocess.PIPE) 
         stderr=subprocess.PIPE) 
      try: 
       out += child.communicate() 
       c_out.write(out) 
       self.queue.put(c_out) 
       self.queue.task_done() 
      except KeyboardInterrupt: 
       child.kill() 


class Starter(): 
    def __init__(self): 
     self.queue = queue 
     t = MyThread(self.queue) 
     t.daemon=True 
     t.start() 
     self.next() 

    def next(self): 
     while True: 
      time.sleep(0.5) 
      if not self.queue.empty(): 
       line = self.queue.get(timeout=0.2) 
       print '\n\nIM IN STARTER %s' % line 
      else: 
       print 'waiting for queue' 

def main(): 
    try: 
     Starter()  
    except KeyboardInterrupt, e: 
     print 'Stopping' 
     raise 

main() 

ответ

1

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

curl_path = '/usr/bin/curl' 
curl_list = [curl_path, 'https://stream.twitter.com/1/statuses/filter.json?track=java', '-u', 'user:pass'] 

вы также используете ненужные для на данный момент ... вы не хотите перебирать этот список вы просто хотите передать его подпроцессу, который будет обрабатывать его соответствующим образом. И вам также захочется, чтобы stdout получал результаты от этого, поэтому вам нужно также включить туда трубу.

т.е., вся вещь должна быть ...

def run(self): 
    curl_path = '/usr/bin/curl' 
    curl_list = [curl_path, 'https://stream.twitter.com/1/statuses/filter.json?track=java', '-u', 'user:pass'] 

    child = subprocess.Popen(curl_list, 
          shell=False, 
          stdout=subprocess.PIPE, 
          stderr=subprocess.PIPE) 
    try: 
     out += child.communicate()[0] 
     c_out.write(out) 
     self.queue.put(c_out) 
     self.queue.task_done() 
     except KeyboardInterrupt: 
      child.kill() 

Может хотите, чтобы еще раз взглянуть на subprocess documentation, чтобы лучше понять изменения выше. Я на самом деле не запускаю это через переводчика, поэтому он может быть не идеальным, но он должен заставить вас идти в правильном направлении ... удачи!

+0

Большое спасибо за ваш ответ. Можете ли вы помочь мне в еще одном: я забыл включить эту переменную 'c_out', определенную как' c_out = cStringIO.StringIO() ', но когда я запускаю ваш код, я все еще ничего не получите в очереди – Vor

+0

Почему вы используете cStringIo? Я не уверен, что это ... вы должны просто добавить строку в очередь. – EEP

+0

Я пробовал то, что вы предложили без cString, и просто положил 'out' в очередь, но позже, когда я проверяю очередь, это ничего мне не показывает. Я хочу сказать, что он пуст – Vor