0

我需要帮助才能从 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() 
4

1 回答 1

1

您似乎对 subprocess 的参数感到困惑...... args 列表应该是您将用于 curl 的命令的所有不同部分,您目前正在以一种不可行的方式将它们放在一起与子流程一起工作。你的 curl_list 应该看起来更像这样......

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

您目前还使用了不必要的 for ......您不想循环遍历该列表,您只想将其传递给将适当处理它的子进程。而且您还希望 stdout 从中获得结果,因此您还需要在其中包含管道。

IE,整个事情应该是......

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()

可能想再看一下子流程文档以更好地理解上述更改。我实际上并没有通过解释器运行它,所以它可能并不完美,但它应该让你朝着正确的方向前进......祝你好运!

于 2013-04-25T14:20:43.533 回答