У меня есть этот код для получения твитов, запустив фоновый процесс. Следующий скрипт запускается из основного скрипта с использованием функции 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
subprocess.Popen(["python", "StreamingAnalytics.py", 'SriLankaQ', 'lanka'])
) - person Wayne Werner   schedule 24.12.2015StreamingAnalytics.py
, просто вызвав его напрямую, не используяsubprocess.Popen
? (т.е. вызовpython StreamingAnalytics.py
в терминале) - person Jon   schedule 25.12.2015on_status
. Когда я удалил, это сработало. Я включил это также в свой вопрос. Я думаю, что проблема в этом. В любом случае, это ваш ответ, который заставил меня работать над этим. Если вы добавите его как ответ с некоторым объяснением, почему он работает при удалении print. Я был бы рад принять это как правильный ответ. - person Marlon Abeykoon   schedule 25.12.2015multiprocessing.Process
вместо запуска Python с подпроцессом... - person Roland Smith   schedule 30.12.2015tweetpy
плохо закодирован и скрывает от вас настоящую ошибку, пожалуйста, взломайте / запрограммируйте его, чтобы получить реальную трассировку. - person Dima Tisnek   schedule 31.12.2015