2015-12-22 19 views
10

Ich habe diesen Code, um Tweets durch Ausführen eines Hintergrundprozesses zu erhalten. Das folgende Skript wird mit der Funktion subprocess.Popen vom Hauptskript ausgeführt. Damit das Hauptskript nach dem Aufruf des Hintergrundprozessskripts nicht mehr ausgeführt wird.Ungültiger Argumentfehler vom Hintergrundprozess, wenn das Hauptskript stoppt

def start_listner(unique_id, keyword, limit=200): 
    class CustomStreamListener(tweepy.StreamListener): 

     def __init__(self, api): 
      logger.info('runnning') 
      self.api = api 
      super(tweepy.StreamListener, self).__init__() 

      #setup rabbitMQ Connection 


     def on_status(self, status): 
      print status.text.encode('utf-8'), "\n" 
      #queue the tweet and writes the tweet to the log 

     def on_error(self, status_code): 
      #some code to not kill the stream 

     def on_timeout(self): 
      #some code to not kill the stream 

    sapi = tweepy.streaming.Stream(auth, CustomStreamListener(api)) 
    try: 
     logger.info('tracking started') 
     logger.info(keyword) 
     logger.info(type(keyword)) 
     kw = keyword 
     sapi.filter(track=[kw]) # keeps listening to the streaming api 
    except Exception, err: 
     logger.info(kw) # fails at this place when main py stops 
     logger.info(err) 

if __name__ == "__main__": 
    logger.info("just now started") 
    try: 
     a = str(sys.argv[1]) 
     b = str(sys.argv[2]) 
     #c = int(sys.argv[5]) 
     logger.info(a) 
     logger.info(b) 
    except Exception, err: 
     logger.info("inside main") 
    start_listner(a, b) 

Nach dem höchsten gestimmten Antwort here Ich benutze das folgende Hauptskript die StreamingAnalytics.py (über Code) aufzurufen

import time 
import subprocess 
subprocess.Popen(["python", "StreamingAnalytics.py", 'SriLankaQ', 'lanka']) 

print 'I could escape.........' 
time.sleep(15) 

Ich habe einen Schlaf gegeben, so werden die Tweets erfolgreich hinzugefügt werden die RabbitMQ-Warteschlange während dieser Zeit. Sobald das Hauptskript gestoppt wird, wird jedoch der folgende Fehler ausgegeben.

2015-12-22 16: 28: 16.559 - Haupt - INFO - { 'Text': ‚RT @Dory: lanka Gesang Hotline bling \ xf0 \ x9F \ x98 \ x82 \ xf0 \ x9F \ x98 \ x82 'Quelle': u'Twitter für iPhone '}

2015-12-22 16: 28: 17.752 - Haupt - INFO - lanka

2015-12-22 16:28 : 17,752 - Haupt - INFO - [Errno 22] ungültiges Argument

UPDATE: Da ich dachte, sein ein Problem nebenbei Argumente entfernte ich die Verwendung von Argumenten, indem sie in eine Datei von Haupt-Skript zu schreiben und die Datei aus Hintergrundprozess-Datei zu lesen. Also,

subprocess.Popen(["python", "StreamingAnalytics.py"]) 

Aber immer noch der gleiche Fehler kommt. Mit dem Traceback-Modul könnte ich mehr Informationen über diesen Fehler drucken.

2015-12-24 11:01:16,562 - __main__ - INFO - Traceback (most recent call last): 
File "StreamingAnalytics.py", line 84, in <module> 
    sapi.filter(track=[keyword]) 
File "C:\Python27\lib\site-packages\tweepy\streaming.py", line 445, in filter 
    self._start(async) 
File "C:\Python27\lib\site-packages\tweepy\streaming.py", line 361, in 
_start 
    self._run() 
File "C:\Python27\lib\site-packages\tweepy\streaming.py", line 294, in _run 
    raise exception IOError: [Errno 22] Invalid argument 
+0

Also ich musste af modifizieren ew dinge, aber [mein beispiel] (https://gist.github.com/waynew/c47fe03405e451709906) funktioniert ganz gut für mich. Funktioniert das auch für dich? Ich habe dein erstes Beispiel Launcher läuft es (dh 'subprocess.Popen ([" python "," StreamingAnalytics.py ", 'SriLankaQ', 'lanka'])') –

+0

Können Sie einfach Ihre 'StreamingAnalytics.py' läuft Rufen Sie es direkt auf, ohne den 'subprocess.Popen' zu verwenden? (Rufen Sie zum Beispiel 'python StreamingAnalytics.py' in einer Endstation auf) – Jon

+0

@WayneWerner Es funktioniert jetzt! Ich habe eine Druckanweisung in der 'on_status'-Funktion. Wenn ich das entfernte, funktionierte es. Das habe ich auch auf meine Frage bezogen. Ich denke, das Problem ist damit. Jedenfalls ist es deine Antwort, die mich dazu gebracht hat, das zu tun. Wenn Sie es als Antwort mit einer Erklärung hinzufügen, warum es funktioniert, wenn Sie drucken entfernt. Ich würde es gerne als die richtige Antwort akzeptieren. –

Antwort

2

Ihre Rückverfolgung ist durch Tweety verdeckt.

Meine Empfehlung:

  • bearbeiten tweepy/streaming.py
  • finden sich die beiden Linien exception = ...
  • hinzufügen logging.exception("foobar") direkt vor oder nach
  • Lauf
  • wieder
  • Beitrag komplette Zurückverfolgungs
+1

Dies liefert keine Antwort auf die Frage. Um einen Autor zu kritisieren oder um Klärung zu bitten, hinterlasse einen Kommentar unter seinem Beitrag. - [Aus Bewertung] (/ review/low-quality-posts/10727819) –

+0

@MadPhysicist Ich fordere Sie heraus, eine bessere Antwort zu posten! Wenn Sie nun alle Legalisten sein wollen, lesen Sie bitte OP sorgfältig, es enthält keine einzige Frage. –

+1

Nur eine Antwort zu posten, um zu sagen, dass du es getan hast, ist sinnlos. Obwohl ich vollkommen der Meinung bin, dass Ihr Ansatz der richtige ist, veröffentlichen Sie keine Antwort als solche. Die von Ihnen empfohlenen Schritte sind im Grunde eine Anfrage für weitere Informationen, die in einem Kommentar eingehen sollten. Sobald das OP erfüllt ist, können Sie eine Antwort schreiben, die sein tatsächliches Problem festlegt. –