我有以下python脚本,可从twitter提取推文并将其发送到kafka主题。该脚本可以完美运行,但是当我尝试在docker容器中运行该脚本时,它无法导入kafka库。它说“ SyntaxError:无效语法”。
以下是python脚本(twitter_app.py)的内容:
import socket
import sys
import requests
import requests_oauthlib
import json
import kafka
from kafka import KafkaProducer
import time
from kafka import SimpleProducer
from kafka import KafkaClient
###################################################
# My own twitter access tokens
####################################################
ACCESS_TOKEN = '28778811-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
ACCESS_SECRET = 'HBGjTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
CONSUMER_KEY = '#################################'
CONSUMER_SECRET = '############################################'
my_auth = requests_oauthlib.OAuth1(CONSUMER_KEY, CONSUMER_SECRET,ACCESS_TOKEN, ACCESS_SECRET)
####################################################
# Kafka Producer
####################################################
twitter_topic="twitter_topic"
client = KafkaClient("10.142.0.2:9092")
producer = SimpleProducer(client)
#producer = kafka.KafkaProducer(bootstrap_servers='10.128.0.2:9092')
def get_tweets():
print("#########################get_tweets called################################")
url = 'https://stream.twitter.com/1.1/statuses/filter.json'
#query_data = [('language', 'en'), ('locations', '-130,-20,100,50'),('track' ,'#')]
#query_data = [('language', 'en'), ('locations', '-3.7834,40.3735,-3.6233,40.4702'),('track','#')]
query_data = [('language', 'en'), ('locations', '-3.7834,40.3735,-3.6233,40.4702'),('track','Madrid')]
query_url = url + '?' + '&'.join([str(t[0]) + '=' + str(t[1]) for t in query_data])
#print("Query url is", query_url)
response = requests.get(query_url, auth=my_auth, stream=True)
print(query_url, response)
return response
def send_tweets_to_kafka(http_resp):
print("########################send_tweets_to_kafka called#################################")
for line in http_resp.iter_lines():
print("reading tweets")
try:
full_tweet = json.loads(line)
tweet_text = full_tweet['text']
print("Tweet Text: " + tweet_text)
print ("------------------------------------------")
tweet_text = tweet_text + '\n'
producer.send_messages(twitter_topic, tweet_text.encode())
#producer.send(twitter_topic, tweet_text.encode())
time.sleep(0.2)
except:
print("Error received")
e = sys.exc_info()[0]
print("Error: %s" % e)
print("Done reading tweets")
##############
# Actual Execution starts here
###############
resp = get_tweets()
send_tweets_to_kafka(resp)
但是,现在我试图在Docker容器中运行此脚本,但是失败,并且出现以下错误:
Traceback (most recent call last):
File "twitter_app.py", line 6, in <module>
import kafka
File "/usr/local/lib/python3.7/site-packages/kafka/__init__.py", line 23, in <module>
from kafka.producer import KafkaProducer
File "/usr/local/lib/python3.7/site-packages/kafka/producer/__init__.py", line 4, in <module>
from .simple import SimpleProducer
File "/usr/local/lib/python3.7/site-packages/kafka/producer/simple.py", line 54
return '<SimpleProducer batch=%s>' % self.async
^
SyntaxError: invalid syntax
作为参考,以下是Dockerfile的内容(请注意,当我在不使用kafka的简单脚本中使用相同的Dockerfile时,它工作得很好):
FROM python:3
MAINTAINER kamal.nandan@<myemailservice>
RUN apt-get update
RUN apt-get install -y python3
RUN pip install requests
RUN pip install requests_oauthlib
RUN pip install kafka
ADD twitter_app.py /
CMD python3 twitter_app.py
过去几天,我一直在与之抗争,但我一直无法弄清这个问题。任何帮助将非常感激。预先感谢。
答案 0 :(得分:2)
该错误仅在python 3.7中发生,因为存在不兼容的更改,此版本为async is a reserved keyword。
解决方案是继续使用python 3.6,直到该库适应新版本为止,issue已经关闭:
FROM python:3.6
MAINTAINER kamal.nandan@<myemailservice>
RUN pip install requests requests_oauthlib kafka
ADD twitter_app.py /
CMD python3 twitter_app.py
(我有减少Dockerfile的自由权)
答案 1 :(得分:0)
我最近遇到了同样的问题:导入kafka时出现“语法无效”。当我替换以下代码时,它以某种方式对我有用:
FROM python:latest
RUN pip install docker
RUN pip install kafka
与此:
FROM python:latest
RUN pip install docker
RUN pip install kafka-python
这对于python 3.7.4毫无问题。我有pip 19.2.3,kafka-python 1.4.7。
答案 2 :(得分:0)
使用pip3安装kafka-python
然后
导入卡夫卡