【问题标题】:Gunicorn, no module named 'myprojectGunicorn,没有名为“myproject”的模块
【发布时间】:2017-01-20 12:22:37
【问题描述】:

我正在新服务器上安装以前构建的网站。我不是最初的开发者。

我过去曾使用 Gunicorn + nginx 来保持应用程序的运行(基本上遵循 this tutorial),但在这里遇到了问题。

source venv/bin/activate,然后./manage.py runserver 0.0.0.0:8000 运行良好,一切都按预期运行。我关闭它并运行gunicorn --bind 0.0.0.0:8000 myproject.wsgi:application,得到以下信息:

[2016-09-13 01:11:47 +0000] [15259] [INFO] Starting gunicorn 19.6.0
[2016-09-13 01:11:47 +0000] [15259] [INFO] Listening at: http://0.0.0.0:8000 (15259)
[2016-09-13 01:11:47 +0000] [15259] [INFO] Using worker: sync
[2016-09-13 01:11:47 +0000] [15262] [INFO] Booting worker with pid: 15262
[2016-09-13 01:11:47 +0000] [15262] [ERROR] Exception in worker process
Traceback (most recent call last):
  File "/var/www/myproject/venv/lib/python3.5/site-packages/gunicorn/arbiter.py", line 557, in spawn_worker
    worker.init_process()
  File "/var/www/myproject/venv/lib/python3.5/site-packages/gunicorn/workers/base.py", line 126, in init_process
    self.load_wsgi()
  File "/var/www/myproject/venv/lib/python3.5/site-packages/gunicorn/workers/base.py", line 136, in load_wsgi
    self.wsgi = self.app.wsgi()
  File "/var/www/myproject/venv/lib/python3.5/site-packages/gunicorn/app/base.py", line 67, in wsgi
    self.callable = self.load()
  File "/var/www/myproject/venv/lib/python3.5/site-packages/gunicorn/app/wsgiapp.py", line 65, in load
    return self.load_wsgiapp()
  File "/var/www/myproject/venv/lib/python3.5/site-packages/gunicorn/app/wsgiapp.py", line 52, in load_wsgiapp
    return util.import_app(self.app_uri)
  File "/var/www/myproject/venv/lib/python3.5/site-packages/gunicorn/util.py", line 357, in import_app
    __import__(module)
ImportError: No module named 'myproject.wsgi'
[2016-09-13 01:11:47 +0000] [15262] [INFO] Worker exiting (pid: 15262)
[2016-09-13 01:11:47 +0000] [15259] [INFO] Shutting down: Master
[2016-09-13 01:11:47 +0000] [15259] [INFO] Reason: Worker failed to boot.

我认为这与整个应用程序的结构有关。之前,我已经构建了具有以下基本结构的应用程序:

myproject
├── manage.py
├── myproject
│   ├── urls.py
│   ├── views.py
│   ├── component1
│   │   ├── urls.py
│   │   └── views.py
│   ├── component2
│   │   ├── urls.py
│   │   └── views.py
├── venv
│   ├── bin
│   └── ...

相反,这个结构具有如下结构:

myproject
├── apps
│   ├── blog
│   │   ├── urls.py
│   │   ├── views.py
│   │     └── ...
│   ├── catalogue
│   │   ├── urls.py
│   │   ├── views.py
│   │     └── ...
│   ├── checkout
│   │   ├── urls.py
│   │   ├── views.py
│   │     └── ...
│   ├── core
│   │   ├── urls.py
│   │   ├── views.py
│   │     └── ...
│   ├── customer
│   ├── dashboard
│   └──  __init__.py
├── __init__.py
├── manage.py
├── project_static
│   ├── assets
│   ├── bower_components
│   └── js
├── public
│   ├── emails
│   ├── media
│   └── static
├── settings
│   ├── base.py
│   ├── dev.py
│   ├── __init__.py
│   ├── local.py
│   └── production.py
├── templates
│   ├── base.html
│   ├── basket
│   ├── blog
│   └── ....
├── urls.py
├── venv
│   ├── bin
│   ├── include
│   ├── lib
│   ├── pip-selfcheck.json
│   └── share
└── wsgi.py

所以,没有运行节目的“主”模块,这正是我期望 gunicorn 正在寻找的。​​p>

有什么想法吗?

wsgi.py

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")

application = get_wsgi_application()

【问题讨论】:

  • myproject.wsgi 在哪里?它的内容是什么?
  • @Plasma 我刚刚更新了问题以包含wsgi.py 的内容——据我了解,这就是 gunicorn 正在寻找的内容,我弄错了吗?
  • 如果您通过 gunicorn --bind 0.0.0.0:8000 myproject.wsgi:application 运行 gunicorn,则 gunicorn 将查找文件 myproject.wsgi 并在该文件中使用名为 application 的变量。
  • 我刚刚尝试了一个裸 django 安装,不同之处在于 venv 是应用程序上方的一个目录。所以我们有:[...]/myproject/venv[...]/myproject/myproject/wsgi.py --- 这行得通。 (没有myproject.wsgi

标签: python django nginx gunicorn


【解决方案1】:

你的错误信息是

ImportError: No module named 'myproject.wsgi'

你运行了这个应用程序

gunicorn --bind 0.0.0.0:8000 myproject.wsgi:application

wsgi.py 有一行

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")

这是断开连接。为了将项目识别为myproject.wsgiparent 目录必须位于 python 路径上...正在运行

cd .. && gunicorn --bind 0.0.0.0:8000 myproject.wsgi:application

将消除该错误。但是,由于 wsgi.py 文件引用的是 settings 而不是 myproject.settings,因此您会得到一个不同的错误。这意味着该应用程序旨在从根目录而不是一个目录运行。您可以通过查看代码来确定这一点——如果它使用绝对导入,他们通常会说from myproject.app import ...from app import ...。如果这个猜测是正确的,你正确的命令是

gunicorn --bind 0.0.0.0:8000 wsgi:application

如果应用确实在所有路径中都使用了myproject,则您必须修改您的 PYTHONPATH 才能正确运行它...

PYTHONPATH=`pwd`/.. gunicorn --bind 0.0.0.0:8000 myproject.wsgi:application

【讨论】:

  • 非常感谢,这条线对我有用:PYTHONPATH=pwd/.. gunicorn --bind 0.0.0.0:8000 myproject.wsgi:application
  • 我的挂断是命名约定是 python 的而不是目录结构。例如:myproject.wsgi 对应于myproject/wsgi.py,而不是文件myproject.wsgi,其中wsgi 是扩展名。感谢您的帮助!
  • myproject in myproject.wsgi 是否代表文件夹名称?还是 Django 项目名称?就我而言,文件夹名称不同,我不能同时使用这两个名称
  • 那是fully qualified module name。在通常情况下,此路径中的名字将是包含__init__.py 文件的顶级目录。
  • (与from myproject.wsgi import application 使用的路径相同)
【解决方案2】:

替换你的python工作目录路径后运行这些命令。

# Go to your current working directory
cd /path/to/folder

# Activate your virtual environment. Ignore if already in activated mode
source /path/to/virtualenv/bin/activate

# Install gunicorn in virtualenv
pip3 install gunicorn

# Run this command. Replace PORT and app name accordingly
gunicorn --bind 0.0.0.0:5000 wsgi:app

【讨论】:

    【解决方案3】:

    如果您使用supervisor,那么您必须在主管配置文件中设置environment,如下所示。

    environment=HOME="/home/to/your/project/root"

    【讨论】:

      【解决方案4】:

      对于我来说, 我的项目结构是

      myproject
      ├── manage.py
      ├── myproject
      │   ├── wsgi.py
      │   ├── ..
      Dockerfile
      docker-composer.yml
      

      所以在docker-composer.yml中,当命令

      gunicorn myproject.wsgi:application --bind 0.0.0.0:8000

      我收到以下错误

      ModuleNotFoundError: 没有名为“myproject.wsgi”的模块

      我们要做的是,我们必须在文件夹中运行 gunicorn 命令,而不是项目根目录。这是工作代码

      sh -c "cd ./myproject && gunicorn myproject.wsgi:application --bind 0.0.0.0:8000"
      

      在 gunicorn 命令之前,我们必须使用“cd ./project”更改目录。在“myproject”目录下,gunicorn 可以清楚地识别我们的项目。

      【讨论】:

      • 这正是我想要的。使用 shell 更改目录,而不是使用 gunicorn 的 --chdir 选项。
      • 对我来说我是在digitalocean上部署的,这是正确的答案,我不需要绑定端口cd ./myproject && gunicorn myproject.wsgi:application
      【解决方案5】:

      我遇到了类似的问题。 gunicorn 由一个全局安装的包运行,而不是安装在虚拟环境中的包。 This 回答帮我弄明白了。

      【讨论】:

        猜你喜欢
        • 2018-11-03
        • 2017-03-21
        • 1970-01-01
        • 2017-08-15
        • 1970-01-01
        • 2019-11-28
        • 2018-10-23
        • 2019-12-01
        • 2020-05-04
        相关资源
        最近更新 更多