【问题标题】:virtualenv not being taken into account (No module name dotenv) in script脚本中未考虑 virtualenv(无模块名称 dotenv)
【发布时间】:2019-05-15 09:57:31
【问题描述】:

我有一个应该启动 gunicorn 的脚本:

set -x
cd $VIRTUALENV
. bin/activate
pip freeze
cd $DJANGODIR

### Start Gunicorn

exec gunicorn ${DJANGO_WSGI_MODULE}:application \
        --name $NAME \
        --workers $NUM_WORKERS \
        --user=$USER --group=$GROUP \
        --log-level=debug \
        --bind=127.0.0.1:8000

从它的输出来看,似乎很清楚虚拟环境被激活并且要求安装正确(因为显示pip freeze时显示模块):

+ cd /home/ubuntu/envs/app
+ . bin/activate
++ deactivate nondestructive
++ unset -f pydoc
++ '[' -z '' ']'
++ '[' -z '' ']'
++ '[' -n /bin/bash ']'
++ hash -r
++ '[' -z '' ']'
++ unset VIRTUAL_ENV
++ '[' '!' nondestructive = nondestructive ']'
++ VIRTUAL_ENV=/home/ubuntu/envs/app
++ export VIRTUAL_ENV
++ _OLD_VIRTUAL_PATH=/home/ubuntu/bin:/home/ubuntu/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:
/usr/games:/usr/local/games:/snap/bin
++ PATH=/home/ubuntu/envs/app/bin:/home/ubuntu/bin:/home/ubuntu/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/s
bin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
++ export PATH
++ '[' -z '' ']'
++ '[' -z '' ']'
++ _OLD_VIRTUAL_PS1=
++ '[' x '!=' x ']'
+++ basename /home/ubuntu/envs/app
++ PS1='(app) '
++ export PS1
++ alias pydoc
++ '[' -n /bin/bash ']'
++ hash -r
+ pip freeze
Django==2.2.1
pkg-resources==0.0.0
postgres==2.2.2
psycopg2-binary==2.8.2
python-dotenv==0.10.2
python-memcached==1.59
pytz==2019.1
six==1.12.0
sqlparse==0.3.0
+ cd /home/ubuntu/app/app

+ exec gunicorn app.wsgi:application --name app --workers 3 --user=ubuntu --group=ubuntu --log-le
vel=debug --bind=127.0.0.1:8000
...

现在,此脚本失败并出现以下错误:

  File "/home/ubuntu/project/app/app/app.py", line 11, in <module>
    from dotenv import load_dotenv, find_dotenv
ImportError: No module named dotenv

这让我怀疑 virtualenv 没有保持激活状态......

如果我手动执行相同的步骤,我不会收到错误:

cd /home/ubuntu/envs/app
. bin/activate
python
>>> from dotenv import load_dotenv, find_dotenv
>>>

任何指针将不胜感激。

【问题讨论】:

    标签: python bash virtualenv gunicorn


    【解决方案1】:

    找到解决方案:将 gunicorn 作为虚拟环境的一部分安装。 通常更新requirements.txt 以添加以下行:

    gunicorn
    

    只有使用与 debian 包一起安装的“gunicorn”才能从 virtualenv 上下文之外进行。

    【讨论】:

      【解决方案2】:

      看起来应用程序没有在正确的位置寻找包。尝试调用sys.path.append() 指示库所在的位置(需要相应地更改路径以匹配环境设置):

      import sys, os
      app_root = os.path.dirname(os.path.realpath(__file__))
      sys.path.append(app_root + '/venv/lib/python3.8/site-packages')
      
      # now you can import the library
      from dotenv import load_dotenv
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-26
        • 2020-08-07
        • 2020-06-29
        • 2018-02-14
        • 1970-01-01
        • 2012-05-01
        相关资源
        最近更新 更多