2015-12-22 3 views
10

У меня есть этот код, чтобы получить твиты, запустив фоновый процесс. Следующий сценарий запускается из основного сценария с использованием функции subprocess.Popen. Так что основной скрипт перестанет выполняться после вызова сценария фонового процесса.Недопустимая ошибка аргумента из фонового процесса при остановке основного скрипта

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) 

Согласно набравшему наибольшему количеству голосов ответа here Я использую следующий основной скрипт для вызова StreamingAnalytics.py (выше коды)

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

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

Я добавил сон так твиты будут успешно добавлены очередь RabbitMQ за это время. Но как только основной скрипт останавливается, фоновый процесс печатает следующую ошибку.

2015-12-22 16: 28: 16559 - главный - INFO - { 'текст': «RT @Dory: ланка пение Горячая линия побрякушки \ xf0 \ x9f \ x98 \ x82 \ xf0 \ x9f \ x98 \ x82 'источник': u'Twitter для iPhone '}

2015-12-22 16: 28: 17752 - главный - INFO - ланка

2015-12-22 16:28 : 17,752 - main - INFO - [Errno 22] Недопустимый аргумент

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

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

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

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

Так что я пришлось модифицировать ew, но [мой пример] (https://gist.github.com/waynew/c47fe03405e451709906) отлично работает для меня. Это тоже работает для вас? У меня есть ваш первый запускающий запуск этого запуска (т. Е. 'Subprocess.Popen ([" python "," StreamingAnalytics.py ", 'SriLankaQ', 'lanka']))) –

+0

Можете ли вы, чтобы ваш' StreamingAnalytics.py' работал просто вызывая его напрямую, не используя 'subprocess.Popen'? (т. е. вызов 'python StreamingAnalytics.py' в терминале) – Jon

+0

@WayneWerner Это работает сейчас! У меня есть оператор print внутри функции 'on_status'. Когда я удалил его, он сработал. Я включил это также в мой вопрос. Я думаю, что проблема в этом. Во всяком случае, ваш ответ, который заставил меня работать над этим. Если вы добавите его в качестве ответа с некоторым объяснением, почему он работает при удалении печати. Я был бы рад принять его в качестве правильного ответа. –

ответ

2

Твой траверс закрыт твитом.

Моя рекомендация:

  • редактировать tweepy/streaming.py
  • найти две линии exception = ...
  • добавить logging.exception("foobar") прямо перед или после
  • снова запустить
  • после завершения отслеживающий
+1

Это не дает ответа на вопрос. Чтобы критиковать или просить разъяснения у автора, оставьте комментарий ниже их сообщения. - [Из обзора] (/ review/low-quality-posts/10727819) –

+0

@MadPhysicist Я призываю вас опубликовать лучший ответ! Теперь, если вы хотите быть всеми легалистами, пожалуйста, внимательно прочитайте OP, в нем нет ни одного вопроса. –

+1

Просто отправляя ответ ради того, чтобы сказать, что вы сделали это, бессмысленно. Хотя я полностью согласен с тем, что ваш подход правильный, вы не отправляете ответ как таковой. Рекомендуемые вами шаги - это, в основном, запрос на получение дополнительной информации, которая должна содержать комментарий. Как только OP выполнит, вы можете опубликовать ответ, фиксирующий его фактическую проблему. –

 Смежные вопросы

  • Нет связанных вопросов^_^