【问题标题】:How to fix ModuleNotFoundError: No module named 'rest_framework' in Ubuntu如何修复 ModuleNotFoundError:Ubuntu 中没有名为“rest_framework”的模块
【发布时间】:2021-11-04 17:46:09
【问题描述】:

我第一次尝试在 AWS EC2 上部署 django 应用程序。我正在使用 Ubuntu 服务器,但碰巧我安装的包无法识别,这些包已经添加到 INSTALLED_APPS。我得到的错误是:

Traceback (most recent call last):
  File "manage.py", line 22, in <module>
    main()
  File "manage.py", line 18, in main
    execute_from_command_line(sys.argv)
  File "/home/ubuntu/.local/lib/python3.6/site-packages/django/core/management/__init__.py", line 419, in execute_from_command_line
    utility.execute()
  File "/home/ubuntu/.local/lib/python3.6/site-packages/django/core/management/__init__.py", line 395, in execute
    django.setup()
  File "/home/ubuntu/.local/lib/python3.6/site-packages/django/__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/home/ubuntu/.local/lib/python3.6/site-packages/django/apps/registry.py", line 91, in populate
    app_config = AppConfig.create(entry)
  File "/home/ubuntu/.local/lib/python3.6/site-packages/django/apps/config.py", line 224, in create
    import_module(entry)
  File "/usr/lib/python3.6/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 994, in _gcd_import
  File "<frozen importlib._bootstrap>", line 971, in _find_and_load
  File "<frozen importlib._bootstrap>", line 953, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'rest_framework'

该错误引用了 INSTALLED APPS 中首先出现的任何包。在这种情况下,restframework 是第一位的。如果在已安装的应用程序中首先出现的是corshearder,则错误将是ModuleNotFoundError: No module named 'corsheaders,依此类推。我知道发生这种行为是因为代码是从 settings.py 文件的顶部到底部解释的。我使用sudo pip install -r requirements.txt 安装了这些包。当问题不断发生时,我使用sudo pip3 install packge_name 重新安装了软件包。我在运行安装之前激活了虚拟环境,但没有找到任何包。我不确定我是否缺少任何步骤,因为我对 linux 命令知之甚少。如何在我的环境变量中正确安装包?

sudo pip3 freeze

asgiref==3.4.1
blinker==1.3
certifi==2021.5.30
chardet==4.0.0
cloud-init==21.1
command-not-found==0.3
configobj==5.0.6
cryptography==1.2.3
dj-database-url==0.5.0
Django==3.2
django-cors-headers==3.7.0
django-countries==7.1
django-rest-framework==0.1.0
django-rest-resetpassword==0.1.2
djangorestframework==3.12.4
gunicorn==20.1.0
hibagent==1.0.1
idna==2.10
Jinja2==2.8
jsonpatch==1.10
jsonpointer==1.9
language-selector==0.1
MarkupSafe==0.23
oauthlib==1.0.3
prettytable==0.7.2
pyasn1==0.1.9
pycurl==7.43.0
pygobject==3.20.0
PyJWT==1.3.0
pyserial==3.0.1
python-apt==1.1.0b1+ubuntu0.16.4.12
python-debian==0.1.27
python-systemd==231
pytz==2021.1
PyYAML==3.11
requests==2.25.1
six==1.15.0
sqlparse==0.4.1
ssh-import-id==5.5
typing-extensions==3.10.0.2
ufw==0.35
unattended-upgrades==0.1
urllib3==1.26.6

【问题讨论】:

  • 尝试执行 pip freeze 并查看是否安装了软件包?所以我不太了解 EC2,但你需要在部署之前创建一个环境吗?
  • 感谢@Rvector。 pip freeze 没有输出任何值,但sudo pip3 freeze 输出包但我安装的包不是ammong。请问我应该怎么做,因为我已经按照问题中的说明运行命令来安装它们,但是sudo pip3 freeze 的输出中不存在已安装的软件包
  • 如果您尝试sudo pip3 freeze djangorestframework,您会得到什么?不要激活环境并再次安装requirements.txt
  • 现在安装requirements.txt而不激活任何环境。只需输入sudo pip3 install -r requirements.txt。并运行你的服务器。
  • 是的,这是一个错字。只需sudo pip3 freeze

标签: python django ubuntu amazon-ec2


【解决方案1】:

发生错误是因为您使用 Sudo 安装了依赖项。 这仅为 Sudo 用户安装了您的 pip 依赖项,而您以非 sudo 用户身份运行 Django 应用程序。这就是为什么你在pip freeze 时没有看到你的包裹,但你在sudo pip3 freeze 之后看到了它们的原因

解决这个问题

  1. 使用此命令安装python3-venv sudo apt-get install python3-venv
  2. 创建一个虚拟环境python3 -m venv env这个命令将创建一个名为env的虚拟环境
  3. 使用此命令激活虚拟环境source env/bin/activate

完成此操作后,您将在 shell 之前看到一个 (env),这表明您的虚拟环境现在已激活,需要在其中安装依赖项

  1. cd 到您的 requirements.txt 并输入 pip3 install -r requirements.txt 确保您在没有 sudo 的情况下执行此操作(因为出于安全原因,您将在 Web 服务器中以非 sudo 特权用户身份运行 Django 应用程序)

之后,您可以在虚拟环境保持活动状态的情况下运行 Django 应用。

【讨论】:

  • 我非常感谢您对我所犯错误的洞察力。你真是个传奇。非常感谢
  • @Ruchit Micro 谢谢,这非常微妙。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2018-05-25
  • 2020-10-10
  • 2022-01-23
  • 2016-01-23
  • 2020-03-20
  • 2020-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多