【问题标题】:ImportError: No module named 'config.settings'; 'config' is not a packageImportError:没有名为“config.settings”的模块; 'config' 不是一个包
【发布时间】:2018-10-16 18:37:24
【问题描述】:

我正在尝试让我的 cookiecutter-django 应用在 Apache 下运行,并通过 pip 安装 mod_wsgi。

python3 manager.py runserver 有效。

但是在 Apache 中运行它后,我收到一条错误消息,提示找不到模块配置。所以我pip install config。 (它没有安装在我的开发系统上。)

将 config.py 文件放在我的 /usr/local/pulseenv/lib/python3.5/site-packages 中。

那个文件有我修复的各种语法错误。据我所知,这些错误是由于 python 2.7 和 3.5 之间的变化造成的。

但是现在我得到了这个错误,我被困在哪里去:

ImportError: No module named 'config.settings'; 'config' is not a package

我在 error.log 中没有看到任何关于如何进一步跟踪错误的线索。那么这个模块是什么?为什么我需要它?以及如何弄清楚我的问题是什么?

编辑:

这是我的虚拟主机文件(/etc/apache2/sites-available/000-default.conf):

<VirtualHost *:80>

        ServerAdmin webmaster@localhost
        #DocumentRoot /var/www/html
        DocumentRoot /var/www/pulsemanager/pulsemanager


            Alias /static /var/www/pulsemanager/pulsemanager/static
            <Directory /var/www/pulsemanager/pulsemanager/static>
                Require all granted
            </Directory>

            <Directory /var/www/pulsemanager/config>
                <Files wsgi.py>
                    Require all granted
                </Files>
            </Directory>

           WSGIScriptAlias / /var/www/pulsemanager/config/wsgi.py
           WSGIDaemonProcess pulsemanager
           WSGIProcessGroup pulsemanager
           WSGIApplicationGroup %{GLOBAL}

    </VirtualHost>

我的项目布局如下:

ubuntu@ip-172-31-84-213:/var/www/pulsemanager$ ls
conf              docs         instantdudiobook.ipynb  package.json         pytest.ini  reqs.txt      setup.cfg
config            env.example  LICENSE                 pulsemanager         README.md   reqs.txt.sav  survey2.txt
CONTRIBUTORS.txt  gulpfile.js  manage.py               pulsenotebook.ipynb  README.rst  requirements  utility
ubuntu@ip-172-31-84-213:/var/www/pulsemanager$ cd pulsemanager/
ubuntu@ip-172-31-84-213:/var/www/pulsemanager/pulsemanager$ ls
contrib  locale  lsrc3  static  surveys  templates  users
ubuntu@ip-172-31-84-213:/var/www/pulsemanager/pulsemanager$

这是我的虚拟环境:

ubuntu@ip-172-31-84-213:/usr/local/pulseenv$ ls
bin  include  lib  lib64  pip-selfcheck.json  pyvenv.cfg  share
ubuntu@ip-172-31-84-213:/usr/local/pulseenv$ cd lib
ubuntu@ip-172-31-84-213:/usr/local/pulseenv/lib$ pip3 list
Package                       Version
----------------------------- ----------------------
apturl                        0.5.2
argon2                        0.1.10
argon2-cffi                   18.1.0
arrow                         0.12.1
beautifulsoup4                4.4.1
binaryornot                   0.4.4
blinker                       1.3
Brlapi                        0.6.4
cairocffi                     0.8.0
certifi                       2018.1.18
cffi                          1.11.5
chardet                       3.0.4
checkbox-support              0.22
click                         6.7
config                        0.3.9
cloud-init                    18.2
command-not-found             0.3
configobj                     5.0.6
cookiecutter                  1.6.0
cryptography                  1.2.3
cssselect2                    0.2.1
cycler                        0.10.0
defer                         1.0.6
defusedxml                    0.5.0
Django                        2.0.3
django-admin-tools            0.8.1
django-allauth                0.35.0
django-autoslug               1.9.3
django-crispy-forms           1.7.2
django-debug-toolbar          1.9.1
django-environ                0.4.4
django-extensions             2.0.6
django-language-field         0.0.3
django-model-utils            3.1.1
feedparser                    5.1.3
future                        0.16.0
guacamole                     0.9.2
hibagent                      1.0.1
httplib2                      0.9.1
idna                          2.6
Jinja2                        2.8
jinja2-time                   0.2.0
jsonpatch                     1.10
jsonpointer                   1.9
language-selector             0.1
louis                         2.6.4
lxml                          3.5.0
Mako                          1.0.3
MarkupSafe                    0.23
oauthlib                      1.0.3
onboard                       1.2.0
padme                         1.1.1
pdfrw                         0.4
pexpect                       4.0.1
pip                           10.0.1
plainbox                      0.25
poyo                          0.4.1
prettytable                   0.7.2
ptyprocess                    0.5
pyasn1                        0.1.9
pycparser                     2.18
pycups                        1.9.73
pycurl                        7.43.0
pygobject                     3.20.0
PyJWT                         1.3.0
pyparsing                     2.0.3
Pyphen                        0.9.4
pyserial                      3.0.1
python-apt                    1.1.0b1+ubuntu0.16.4.1
python-dateutil               2.7.0
python-debian                 0.1.27
python-systemd                231
python3-openid                3.1.0
pytz                          2018.3
pyxdg                         0.25
PyYAML                        3.11
reportlab                     3.3.0
requests                      2.18.4
requests-oauthlib             0.8.0
sessioninstaller              0.0.0
setuptools                    39.1.0
six                           1.10.0
sqlparse                      0.2.4
ssh-import-id                 5.5
system-service                0.3
tinycss2                      0.6.1
ubuntu-drivers-common         0.0.0
ufw                           0.35
unattended-upgrades           0.1
unity-scope-calculator        0.1
unity-scope-chromiumbookmarks 0.1
unity-scope-colourlovers      0.1
unity-scope-devhelp           0.1
unity-scope-firefoxbookmarks  0.1
unity-scope-gdrive            0.7
unity-scope-manpages          0.1
unity-scope-openclipart       0.1
unity-scope-texdoc            0.1
unity-scope-tomboy            0.1
unity-scope-virtualbox        0.1
unity-scope-yelp              0.1
unity-scope-zotero            0.1
urllib3                       1.22
usb-creator                   0.3.0
webencodings                  0.5.1
wheel                         0.29.0
whichcraft                    0.4.1
xdiagnose                     3.8.4.1
xkit                          0.0.0
XlsxWriter                    0.7.3

编辑 2:

我确实有一个配置目录:

ubuntu@ip-172-31-84-213:~$ cd /var/www/pulsemanager/config/
ubuntu@ip-172-31-84-213:/var/www/pulsemanager/config$ ls
__init__.py  __pycache__  settings  urls.py  wsgi.py
ubuntu@ip-172-31-84-213:/var/www/pulsemanager/config$ cd settings
ubuntu@ip-172-31-84-213:/var/www/pulsemanager/config/settings$ ls
base.py  __init__.py  local.py  production.py  __pycache__  test.py
ubuntu@ip-172-31-84-213:/var/www/pulsemanager/config/settings$

这是我的 wsgi.py。似乎 DJANGO_SETTINGS_MODULE 应该默认为 config.settings.production (/var/pulsemanager/config/settings/production.py):

"""
WSGI config for pulsemanager project.


"""
import os
import sys

from django.core.wsgi import get_wsgi_application

# This allows easy placement of apps within the interior
# pulsemanager directory.
app_path = os.path.dirname(os.path.abspath(__file__)).replace('/config', '')
sys.path.append(os.path.join(app_path, 'pulsemanager'))

if os.environ.get('DJANGO_SETTINGS_MODULE') == 'config.settings.production':
    from raven.contrib.django.raven_compat.middleware.wsgi import Sentry

# We defer to a DJANGO_SETTINGS_MODULE already in the environment. This breaks
# if running multiple sites in the same mod_wsgi process. To fix this, use
# mod_wsgi daemon mode with each site in its own daemon process, or use
# os.environ["DJANGO_SETTINGS_MODULE"] = "config.settings.production"
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.production")

# This application object is used by any WSGI server configured to use this
# file. This includes Django's development server, if the WSGI_APPLICATION
# setting points here.
application = get_wsgi_application()
if os.environ.get('DJANGO_SETTINGS_MODULE') == 'config.settings.production':
    application = Sentry(application)
# Apply WSGI middleware here.
# from helloworld.wsgi import HelloWorldApplication
# application = HelloWorldApplication(application)

编辑 3:

我删除了配置包。我很确定那是一条红鲱鱼。我在 wsgi.py 中看到了几个对“配置”的引用,例如 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.production")app_path = os.path.dirname(os.path.abspath(__file__)).replace('/config', '')。这些事情之一是我的问题所在吗?

我将export DJANGO_SETTINGS_MODULE=config.settings.production 添加到config/__init__.py,甚至尝试将os.environ["DJANGO_SETTINGS_MODULE"] = "config.settings.production" 放在wsgi.py 顶部附近。

我将 WSGIDaemonProcess 更新为:

WSGIDaemonProcess pulsemanager python-home=/usr/local/pulseenv/  python-path=/var/www/pulsemanager/pulsemanager:/usr/local/pulseenv/lib/python3.5/site-packages 

但我仍然得到:

ImportError: No module named 'config'

这里是更多的error.log

    [Tue May 08 16:58:33.360155 2018] [mpm_event:notice] [pid 7420:tid 139690171062144] AH00489: Apache/2.4.18 (Ubuntu) OpenSSL/1.0.2g mod_wsgi/4.6.4 Python/3.5 configured -- resuming normal operations
    [Tue May 08 16:58:33.360248 2018] [core:notice] [pid 7420:tid 139690171062144] AH00094: Command line: '/usr/sbin/apache2'
    [Tue May 08 16:58:33.414142 2018] [wsgi:info] [pid 7423:tid 139690171062144] mod_wsgi (pid=7423): Attach interpreter ''.
    [Tue May 08 16:58:33.437248 2018] [wsgi:info] [pid 7423:tid 139690171062144] mod_wsgi (pid=7423): Adding '/var/www/pulsemanager/pulsemanager' to path.
    [Tue May 08 16:58:33.441845 2018] [wsgi:info] [pid 7423:tid 139690171062144] mod_wsgi (pid=7423): Adding '/usr/local/pulseenv/lib/python3.5/site-packages' to path.
    [Tue May 08 16:58:33.449915 2018] [wsgi:info] [pid 7423:tid 139690171062144] mod_wsgi (pid=7423): Imported 'mod_wsgi'.
    [Tue May 08 16:58:33.454029 2018] [wsgi:info] [pid 7423:tid 139690021156608] [remote 172.31.6.98:39831] mod_wsgi (pid=7423, process='pulsemanager', application=''): Loading Python script file '/var/www/pulsemanager/config/wsgi.py'.
    [Tue May 08 16:58:33.683108 2018] [wsgi:error] [pid 7423:tid 139690021156608] [remote 172.31.6.98:39831] mod_wsgi (pid=7423): Failed to exec Python script file '/var/www/pulsemanager/config/wsgi.py'.
    [Tue May 08 16:58:33.683161 2018] [wsgi:error] [pid 7423:tid 139690021156608] [remote 172.31.6.98:39831] mod_wsgi (pid=7423): Exception occurred processing WSGI script '/var/www/pulsemanager/config/wsgi.py'.
   ...

    [Tue May 08 16:59:13.003234 2018] [wsgi:error] [pid 7423:tid 139689928836864] [remote 172.31.93.15:41324] ImportError: No module named 'config'

【问题讨论】:

  • 你能把你的项目的结构放上来吗?而不是相同的日志。
  • @FrankAK 我添加了更多细节。这有帮助还是我仍然错过了什么?感谢您的帮助。
  • 您的项目中似乎没有创建config 文件夹!
  • 您确定 Apache 甚至开始使用该配置。 WSGIPythonHomen 和 WSGIPythonPath 不应该被允许在 VirtualHost 中。改用 mod_wsgi 的守护程序模式,改用 WSGIDaemonProcess 上的 python-home 和 python-path。请参阅有关使用虚拟环境的 mod_wsgi 文档。
  • @GrahamDumpleton 抱歉,我更正了,但发布了旧版本。

标签: python django cookiecutter-django


【解决方案1】:

您的DJANGO_SETTINGS_MODULE 需要指定项目根文件夹中存在的包或模块。

[pulsemanager]/
├── [config]/
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py

virtual environments

使用 mod_wsgi 守护进程模式

WSGIDaemonProcess pulsemanager python-home=/path/to/venv/
WSGIProcessGroup pulsemanager

对于在单个 mod_wsgi 进程中运行的多个站点,所有站点都将使用碰巧首先运行的站点的设置。这可以通过改变来解决:

os.environ["DJANGO_SETTINGS_MODULE"] = "{{ project_name }}.settings.{{env}}"

更新了 wsgi.py

import os
import sys

from django.core.wsgi import get_wsgi_application

sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "pulsemanager.settings.production")

if os.environ.get("DJANGO_SETTINGS_MODULE") == "pulsemanager.settings.production":
    from raven.contrib.django.raven_compat.middleware.wsgi import Sentry
    application = Sentry(get_wsgi_application())
else:
    get_wsgi_application()

【讨论】:

  • 请看我的编辑 2。
  • 有意义的是,您需要在设置包中使用__init__.py 并导出DJANGO_SETTINGS_MODULE=config.settings.production
  • 可能需要更新python路径WSGIDaemonProcess python-path=path/to/lib/python3.5/site-packages:/project/path
  • 你不应该使用python-path来添加site-packages,使用python-home来设置虚拟环境的位置。见:modwsgi.readthedocs.io/en/develop/user-guides/…
  • 感谢 WSGIPythonHome 应该是 venv python 包的指令。
【解决方案2】:

我曾经遇到过类似的问题:

$ py -3 bloody.py
Traceback (most recent call last):
  File "bloody.py", line 1, in <module>
    import requests
ModuleNotFoundError: No module named 'requests'

即使我按照 Cisco Devnet 网站上的说明进行操作,也会发生这种情况,该网站建议:

pip install requests

我最终运行的是:

py -2 -m pip install requests

py -3 -m pip install requests

这为 Python 3 和 Python 2 安装了 requests

【讨论】:

    【解决方案3】:

    从没有 init 文件的本地文件夹导入时,我遇到了同样的问题,因为这会导致循环导入。

    尝试echo $PYTHONPATH,将此变量重置为空白对我有用。

    【讨论】:

      【解决方案4】:

      从 linux 终端运行 django,而不是 vs code 终端

      • 我只有在使用 vs code 终端时才有过这种疯狂的体验
      • 激活您的虚拟环境并从默认的 linux 终端运行
      • (app_venv)machinery@001:~/Desktop/yourprj$ ./manage.py runserver

      【讨论】:

        猜你喜欢
        • 2019-07-07
        • 2014-07-15
        • 2018-04-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-11
        • 2016-01-23
        • 2014-11-15
        相关资源
        最近更新 更多