SyntaxError: invalid syntax - yield from iterable when using celery
SyntaxError: invalid syntax - yield from iterable when using celery
我正在创建一个基本的 Flask 应用程序来定期发送电子邮件。当我安装 celery 时,我在它所依赖的名为 more_itertools
的库之一中遇到语法错误。
...
[838946] yield from iterable
[838950] ^
[838955] SyntaxError: invalid syntax
我无法进一步排除故障。请帮忙。
- Celery 版本 - 4.3.0
- Python 版本 - 3.6.8
Requirements.txt:
alembic==1.3.1
amqp==2.5.2
billiard==3.6.1.0
blinker==1.4
celery==4.3.0
certifi==2019.6.16
chardet==3.0.4
Click==7.0
colorama==0.4.1
Flask==1.1.1
Flask-Mail==0.9.1
Flask-Migrate==2.5.2
Flask-SQLAlchemy==2.4.1
idna==2.8
importlib-metadata==1.3.0
itsdangerous==1.1.0
Jinja2==2.10.1
kombu==4.6.7
Mako==1.1.0
MarkupSafe==1.1.1
more-itertools==8.0.2
pymaging==0.1
pymaging-png==0.1
python-dateutil==2.8.1
python-editor==1.0.4
pytz==2019.3
qrcode==6.1
razorpay==1.2.0
requests==2.22.0
six==1.12.0
SQLAlchemy==1.3.11
urllib3==1.25.3
vine==1.3.0
Werkzeug==0.15.5
zipp==0.6.0
__init__.py
...
celery = Celery(app.name, broker=app.config['CELERY_BROKER_URL'])
celery.conf.update(app.config)
...
views/home.py
...
r = send_mail(email).delay(10, 20)
...
@celery.task
def send_mail(email):
# email stuff
完整回溯:
[838493] mod_wsgi (pid=12557): Exception occurred processing WSGI script '/var/www/myapp.com/public_html/myapp.wsgi'.
[838556] Traceback (most recent call last):
[838580] File "/var/www/myapp.com/public_html/myapp.wsgi", line 4, in <module>
[838617] from myapp import app as application
[838626] File "/var/www/myapp.com/public_html/myapp/__init__.py", line 13, in <module>
[838642] from celery import Celery
[838650] File "/var/www/myapp.com/public_html/venv/lib/python3.6/site-packages/celery/local.py", line 509, in __getattr__
[838665] module = __import__(self._object_origins[name], None, None, [name])
[838672] File "/var/www/myapp.com/public_html/venv/lib/python3.6/site-packages/celery/app/__init__.py", line 5, in <module>
[838686] from celery import _state
[838693] File "/var/www/myapp.com/public_html/venv/lib/python3.6/site-packages/celery/_state.py", line 17, in <module>
[838705] from celery.utils.threads import LocalStack
[838712] File "/var/www/myapp.com/public_html/venv/lib/python3.6/site-packages/celery/utils/__init__.py", line 8, in <module>
[838726] from .functional import memoize # noqa
[838745] File "/var/www/myapp.com/public_html/venv/lib/python3.6/site-packages/celery/utils/functional.py", line 10, in <module>
[838759] from kombu.utils.functional import (LRUCache, dictfilter, is_list, lazy,
[838766] File "/var/www/myapp.com/public_html/venv/lib/python3.6/site-packages/kombu/utils/__init__.py", line 5, in <module>
[838779] from .compat import fileno, maybe_fileno, nested, register_after_fork
[838786] File "/var/www/myapp.com/public_html/venv/lib/python3.6/site-packages/kombu/utils/compat.py", line 14, in <module>
[838798] import importlib_metadata
[838805] File "/var/www/myapp.com/public_html/venv/lib/python3.6/site-packages/importlib_metadata/__init__.py", line 9, in <module>
[838818] import zipp
[838825] File "/var/www/myapp.com/public_html/venv/lib/python3.6/site-packages/zipp.py", line 12, in <module>
[838844] import more_itertools
[838868] File "/var/www/myapp.com/public_html/venv/lib/python3.6/site-packages/more_itertools/__init__.py", line 1, in <module>
[838893] from .more import * # noqa
[838939] File "/var/www/myapp.com/public_html/venv/lib/python3.6/site-packages/more_itertools/more.py", line 460
[838946] yield from iterable
[838950] ^
[838955] SyntaxError: invalid syntax
Apache 配置:
<VirtualHost *:80>
ServerAdmin admin@myapp.com
ServerName myapp.com
WSGIDaemonProcess myapp user=myuser group=sudo threads=5 python-path=/var/www/myapp.com:/var/www/myapp.com/public_html/venv/lib/python3.6/site-packages/
WSGIScriptAlias / /var/www/myapp.com/public_html/myapp.wsgi
DocumentRoot /var/www/myapp.com/public_html
<Directory /var/www/myapp.com/public_html>
WSGIProcessGroup myapp
WSGIApplicationGroup %{GLOBAL}
Order deny,allow
Allow from all
WSGIScriptReloading On
</Directory>
</VirtualHost>
myapp.wsgi
import sys
sys.path.insert(0, "/var/www/myapp.com/public_html/")
from myapp import app as application
from werkzeug.debug import DebuggedApplication
application = DebuggedApplication(application, True)
我不认为你真的是运行 Python3.6。 python 解释器实际上是由 mod_wsgi 选择的,并且可能是一个不支持 yield from
-Syntax 的旧解释器。
有关如何验证您实际选择的解释器的说明,请参阅 https://modwsgi.readthedocs.io/en/develop/user-guides/checking-your-installation.html#python-installation-in-use。
1。尝试添加
python-home=directory
Set the location of the Python virtual environment to be used by the daemon processes. The directory to use is that which sys.prefix is set to for the Python virtual environment. The virtual environment can have been created by virtualenv, pyvenv or python -m venv.
Note that the Python virtual environment must have been created using the same base Python version as was used to compile the mod_wsgi module. You can’t use this to force mod_wsgi to somehow use a different Python version than it was compiled for. If you want to use a different version of Python, you will need to reinstall mod_wsgi, compiling it for the version you want. It is not possible for the one mod_wsgi instance to run applications for both Python 2 and 3 at the same time.
来自 modwsgi 文档 https://modwsgi.readthedocs.io/en/develop/configuration-directives/WSGIDaemonProcess.html#wsgidaemonprocess
2。打印当前的“apache 运行 python 版本”
将 print(sys.version)
添加到您的 myapp.wsgi
脚本以在 apache 日志中查看 python 运行 版本
我也有这个问题,我正在 python2.7 环境中工作。
根本原因是芹菜对海带有依赖性,
尝试使用 pip freeze | grep kombu
检查您的 kombu 版本
我看到我的版本是4.6.0,
我删除了 4.6.0 并降级到 4.1.0
解决了这个问题
我正在创建一个基本的 Flask 应用程序来定期发送电子邮件。当我安装 celery 时,我在它所依赖的名为 more_itertools
的库之一中遇到语法错误。
...
[838946] yield from iterable
[838950] ^
[838955] SyntaxError: invalid syntax
我无法进一步排除故障。请帮忙。
- Celery 版本 - 4.3.0
- Python 版本 - 3.6.8
Requirements.txt:
alembic==1.3.1
amqp==2.5.2
billiard==3.6.1.0
blinker==1.4
celery==4.3.0
certifi==2019.6.16
chardet==3.0.4
Click==7.0
colorama==0.4.1
Flask==1.1.1
Flask-Mail==0.9.1
Flask-Migrate==2.5.2
Flask-SQLAlchemy==2.4.1
idna==2.8
importlib-metadata==1.3.0
itsdangerous==1.1.0
Jinja2==2.10.1
kombu==4.6.7
Mako==1.1.0
MarkupSafe==1.1.1
more-itertools==8.0.2
pymaging==0.1
pymaging-png==0.1
python-dateutil==2.8.1
python-editor==1.0.4
pytz==2019.3
qrcode==6.1
razorpay==1.2.0
requests==2.22.0
six==1.12.0
SQLAlchemy==1.3.11
urllib3==1.25.3
vine==1.3.0
Werkzeug==0.15.5
zipp==0.6.0
__init__.py
...
celery = Celery(app.name, broker=app.config['CELERY_BROKER_URL'])
celery.conf.update(app.config)
...
views/home.py
...
r = send_mail(email).delay(10, 20)
...
@celery.task
def send_mail(email):
# email stuff
完整回溯:
[838493] mod_wsgi (pid=12557): Exception occurred processing WSGI script '/var/www/myapp.com/public_html/myapp.wsgi'.
[838556] Traceback (most recent call last):
[838580] File "/var/www/myapp.com/public_html/myapp.wsgi", line 4, in <module>
[838617] from myapp import app as application
[838626] File "/var/www/myapp.com/public_html/myapp/__init__.py", line 13, in <module>
[838642] from celery import Celery
[838650] File "/var/www/myapp.com/public_html/venv/lib/python3.6/site-packages/celery/local.py", line 509, in __getattr__
[838665] module = __import__(self._object_origins[name], None, None, [name])
[838672] File "/var/www/myapp.com/public_html/venv/lib/python3.6/site-packages/celery/app/__init__.py", line 5, in <module>
[838686] from celery import _state
[838693] File "/var/www/myapp.com/public_html/venv/lib/python3.6/site-packages/celery/_state.py", line 17, in <module>
[838705] from celery.utils.threads import LocalStack
[838712] File "/var/www/myapp.com/public_html/venv/lib/python3.6/site-packages/celery/utils/__init__.py", line 8, in <module>
[838726] from .functional import memoize # noqa
[838745] File "/var/www/myapp.com/public_html/venv/lib/python3.6/site-packages/celery/utils/functional.py", line 10, in <module>
[838759] from kombu.utils.functional import (LRUCache, dictfilter, is_list, lazy,
[838766] File "/var/www/myapp.com/public_html/venv/lib/python3.6/site-packages/kombu/utils/__init__.py", line 5, in <module>
[838779] from .compat import fileno, maybe_fileno, nested, register_after_fork
[838786] File "/var/www/myapp.com/public_html/venv/lib/python3.6/site-packages/kombu/utils/compat.py", line 14, in <module>
[838798] import importlib_metadata
[838805] File "/var/www/myapp.com/public_html/venv/lib/python3.6/site-packages/importlib_metadata/__init__.py", line 9, in <module>
[838818] import zipp
[838825] File "/var/www/myapp.com/public_html/venv/lib/python3.6/site-packages/zipp.py", line 12, in <module>
[838844] import more_itertools
[838868] File "/var/www/myapp.com/public_html/venv/lib/python3.6/site-packages/more_itertools/__init__.py", line 1, in <module>
[838893] from .more import * # noqa
[838939] File "/var/www/myapp.com/public_html/venv/lib/python3.6/site-packages/more_itertools/more.py", line 460
[838946] yield from iterable
[838950] ^
[838955] SyntaxError: invalid syntax
Apache 配置:
<VirtualHost *:80>
ServerAdmin admin@myapp.com
ServerName myapp.com
WSGIDaemonProcess myapp user=myuser group=sudo threads=5 python-path=/var/www/myapp.com:/var/www/myapp.com/public_html/venv/lib/python3.6/site-packages/
WSGIScriptAlias / /var/www/myapp.com/public_html/myapp.wsgi
DocumentRoot /var/www/myapp.com/public_html
<Directory /var/www/myapp.com/public_html>
WSGIProcessGroup myapp
WSGIApplicationGroup %{GLOBAL}
Order deny,allow
Allow from all
WSGIScriptReloading On
</Directory>
</VirtualHost>
myapp.wsgi
import sys
sys.path.insert(0, "/var/www/myapp.com/public_html/")
from myapp import app as application
from werkzeug.debug import DebuggedApplication
application = DebuggedApplication(application, True)
我不认为你真的是运行 Python3.6。 python 解释器实际上是由 mod_wsgi 选择的,并且可能是一个不支持 yield from
-Syntax 的旧解释器。
有关如何验证您实际选择的解释器的说明,请参阅 https://modwsgi.readthedocs.io/en/develop/user-guides/checking-your-installation.html#python-installation-in-use。
1。尝试添加
python-home=directory
Set the location of the Python virtual environment to be used by the daemon processes. The directory to use is that which sys.prefix is set to for the Python virtual environment. The virtual environment can have been created by virtualenv, pyvenv or python -m venv.
Note that the Python virtual environment must have been created using the same base Python version as was used to compile the mod_wsgi module. You can’t use this to force mod_wsgi to somehow use a different Python version than it was compiled for. If you want to use a different version of Python, you will need to reinstall mod_wsgi, compiling it for the version you want. It is not possible for the one mod_wsgi instance to run applications for both Python 2 and 3 at the same time.
来自 modwsgi 文档 https://modwsgi.readthedocs.io/en/develop/configuration-directives/WSGIDaemonProcess.html#wsgidaemonprocess
2。打印当前的“apache 运行 python 版本”
将 print(sys.version)
添加到您的 myapp.wsgi
脚本以在 apache 日志中查看 python 运行 版本
我也有这个问题,我正在 python2.7 环境中工作。 根本原因是芹菜对海带有依赖性,
尝试使用 pip freeze | grep kombu
检查您的 kombu 版本
我看到我的版本是4.6.0, 我删除了 4.6.0 并降级到 4.1.0
解决了这个问题