[当为带有Flancorn的Flask应用程序提供服务时,我假设我应该在gunicorn myapp:app
之前激活venv,因为Gunicorn连同该应用程序的其他软件包和代码一起安装在venv中。在使用flask run
或python myapp.py
来运行应用程序的情况下,首先需要激活venv(在我阅读的所有教程和书中),因此在我看来,没有理由认为枪杀案的情况有所不同。
然后,当将gunicorn设为系统服务单元时,正如我在这种情况下所知,没有办法像在交互式shell中那样“激活venv”,我能想到的最接近的方法是将Environment="PATH=/PathToMyApp:other_default_path_var_contents"
和Environment="VIRTUAL_ENV=/PathToMyApp/.venv"
在配置中,连同ExecStart=/PathToMyApp/.venv/bin/gunicorn myapp:app
。
但是,我发现我读过的几乎所有教程都没有按照我的想法添加这些环境选项。那些教程是否只是对此有误,还是环境变量对于虚拟环境中的炮弹来说微不足道?如果是后者,那是为什么呢?与flask run
和python myapp.py
案件有什么区别?
[查看官方的gunicorn文档,systemd
的部分说明您应该定义:
systemd
这应该足够,不必设置WorkingDirectory=/PathToMyApp
ExecStart=/PathToMyApp/.venv/bin/gunicorn myapp:app
或PATH
环境变量。
那些教程是否只是对此有误,或者对于虚拟环境中的金枪鱼而言,环境变量无关紧要?如果是后者,那是为什么呢?与flask run和python myapp.py案例有什么区别?
当您在外壳程序上激活了虚拟环境的情况下运行VIRTUAL_ENV
时,它实际上正在运行虚拟环境python myapp.py
目录中的python解释器。您可以如下所示:
这将显示您的系统Python:
bin
激活静脉:
/tmp $ which python
/usr/local/bin/python
这将显示venv中的python解释器:
/tmp $ . venv/bin/activate
此外,当您(venv) /tmp $ which python
/tmp/venv/bin/python
时,爆炸行指向该venv中的python解释器:
cat venv/bin/gunicorn
因此,当您在#!/tmp/venv/bin/python3
单位文件中将其指定为systemd
时(或在未激活venv的情况下直接执行ExecStart
时),它实际上是在venv/bin/gunicorn
上运行的,这反过来会使该venv中安装了所有依赖项可用于该过程。