Ошибка недопустимого аргумента из фонового процесса при остановке основного скрипта

У меня есть этот код для получения твитов, запустив фоновый процесс. Следующий скрипт запускается из основного скрипта с использованием функции 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)

Согласно ответу с наибольшим количеством голосов здесь я использую следующий основной скрипт для вызова 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:16,559 - main - INFO - {'текст': 'RT @Dory: lanka поет побрякушки горячей линии \xf0\x9f\x98\x82\xf0\x9f\x98 \x82 'источник': u'Twitter для iPhone'}

2015-12-22 16:28:17,752 - главная - ИНФОРМАЦИЯ - ланка

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

ОБНОВЛЕНИЕ: Поскольку я подумал, что проблема заключается в передаче аргументов, я удалил использование аргументов, записав их в файл основным скриптом и прочитав файл из файла фонового процесса. Так,

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

person Marlon Abeykoon    schedule 22.12.2015    source источник
comment
Поэтому мне пришлось кое-что изменить, но мой пример отлично работает. Это работает и для вас? У меня запущен ваш первый пример запуска (т.е. subprocess.Popen(["python", "StreamingAnalytics.py", 'SriLankaQ', 'lanka']))   -  person Wayne Werner    schedule 24.12.2015
comment
Можете ли вы запустить StreamingAnalytics.py, просто вызвав его напрямую, не используя subprocess.Popen? (т.е. вызов python StreamingAnalytics.py в терминале)   -  person Jon    schedule 25.12.2015
comment
@WayneWerner Теперь это работает! У меня есть оператор печати внутри функции on_status. Когда я удалил, это сработало. Я включил это также в свой вопрос. Я думаю, что проблема в этом. В любом случае, это ваш ответ, который заставил меня работать над этим. Если вы добавите его как ответ с некоторым объяснением, почему он работает при удалении print. Я был бы рад принять это как правильный ответ.   -  person Marlon Abeykoon    schedule 25.12.2015
comment
Попробуйте использовать multiprocessing.Process вместо запуска Python с подпроцессом...   -  person Roland Smith    schedule 30.12.2015
comment
@RolandSmith не умрет, когда основной сценарий завершится?   -  person Marlon Abeykoon    schedule 30.12.2015
comment
@MarlonAbeykoon Это другой процесс, поэтому его следует продолжать.   -  person Roland Smith    schedule 30.12.2015
comment
@MarlonAbeykoon, так что tweetpy плохо закодирован и скрывает от вас настоящую ошибку, пожалуйста, взломайте / запрограммируйте его, чтобы получить реальную трассировку.   -  person Dima Tisnek    schedule 31.12.2015


Ответы (1)


Ваша трассировка скрыта tweetpy.

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

  • редактировать tweepy/streaming.py
  • найти две строки exception = ...
  • добавить logging.exception("foobar") прямо перед или после
  • бежать снова
  • опубликовать полную трассировку
person Dima Tisnek    schedule 30.12.2015
comment
Это не дает ответа на вопрос. Чтобы подвергнуть критике или запросить разъяснения у автора, оставьте комментарий под его публикацией. – Из обзора - person Mad Physicist; 30.12.2015
comment
@MadPhysicist Я призываю вас опубликовать лучший ответ! Теперь, если вы хотите быть законником, пожалуйста, внимательно прочитайте ОП, в нем нет ни одного вопроса. - person Dima Tisnek; 31.12.2015
comment
Просто публиковать ответ ради того, чтобы сказать, что вы это сделали, бессмысленно. Хотя я полностью согласен с тем, что ваш подход является правильным, вы не публикуете ответ как таковой. Шаги, которые вы рекомендуете, в основном представляют собой запрос на дополнительную информацию, которая должна быть в комментарии. Как только ОП выполнит его, вы можете опубликовать ответ, устраняющий его актуальную проблему. - person Mad Physicist; 31.12.2015
comment
@qarma Можете ли вы сказать мне точную строку в github.com/tweepy/ tweepy/blob/master/tweepy/streaming.py? Кстати, я обнаружил, что оператор print в сценарии фонового процесса приводит к этой ошибке (как помогло @Wayne в комментариях к вопросу). Когда я удаляю оператор печати, он работал. Если вы можете расширить свой ответ, объяснив причину этого, я был бы рад принять этот ответ. - person Marlon Abeykoon; 31.12.2015