web-dev-qa-db-fra.com

Les importations relatives nécessitent l'argument 'package'

Je souhaite utiliser Sphinx afin qu'il puisse générer automatiquement un pydoc pour mon code python, mais je reçois une erreur. Qu'est-ce que je fais mal?

conf.py fichier de configuration sphinx

import sys
import os
from Django.conf import settings
os.environ['Django_SETTINGS_MODULE'] = '../cloud_server.settings'

sys.path.insert(0, os.path.abspath('../cloud_server/cloud_api'))

views.py fichier Django

from Django.contrib.auth.models import User, Group
from rest_framework import viewsets
from cloud_api.serializers import UserSerializer, GroupSerializer


class UserViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows users to be viewed or edited.
    """
    queryset = User.objects.all()
    serializer_class = UserSerializer


class GroupViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows users to be viewed or edited.
    """
    queryset = Group.objects.all()
    serializer_class = GroupSerializer

Typeerror erreur renvoyée lorsque j'essaie de créer le fichier html.

    C:\Users\ogward\STUDPROJ\docs\code.rst:3: WARNING: autodoc: failed to import module u'views'; the following exception wa
s raised:
Traceback (most recent call last):
  File "C:\Python27\lib\site-packages\sphinx-1.2.2-py2.7.Egg\sphinx\ext\autodoc.py", line 335, in import_object
    __import__(self.modname)
  File "C:\Users\ogward\STUDPROJ\cloud_server\cloud_api\views.py", line 1, in <module>
    from Django.contrib.auth.models import User, Group
  File "C:\Python27\lib\site-packages\Django\contrib\auth\__init__.py", line 6, in <module>
    from Django.middleware.csrf import rotate_token
  File "C:\Python27\lib\site-packages\Django\middleware\csrf.py", line 14, in <module>
    from Django.utils.cache import patch_vary_headers
  File "C:\Python27\lib\site-packages\Django\utils\cache.py", line 26, in <module>
    from Django.core.cache import get_cache
  File "C:\Python27\lib\site-packages\Django\core\cache\__init__.py", line 69, in <module>
    if DEFAULT_CACHE_ALIAS not in settings.CACHES:
  File "C:\Python27\lib\site-packages\Django\conf\__init__.py", line 54, in __getattr__
    self._setup(name)
  File "C:\Python27\lib\site-packages\Django\conf\__init__.py", line 49, in _setup
    self._wrapped = Settings(settings_module)
  File "C:\Python27\lib\site-packages\Django\conf\__init__.py", line 128, in __init__
    mod = importlib.import_module(self.SETTINGS_MODULE)
  File "C:\Python27\lib\site-packages\Django\utils\importlib.py", line 33, in import_module
    raise TypeError("relative imports require the 'package' argument")
TypeError: relative imports require the 'package' argument
looking for now-outdated files... none found
pickling environment... done
checking consistency... done
preparing documents... done
writing output... [ 50%] code
writing output... [100%] index

writing additional files... genindex search
copying static files... done
copying extra files... done
dumping search index... done
dumping object inventory... done
build succeeded, 1 warning.
13
ogward

Django_SETTINGS_MODULE devrait être un identifiant de module Python , et non un chemin de système de fichiers. En regardant le fichier Django/conf/__init__py, il semble qu'un chemin relatif à votre module de paramètres ne fonctionne pas là. Vous devrez le déplacer sous un répertoire répertorié dans votre sys.path, ou vous devrez ajouter un répertoire parent à votre sys.path et référencer votre module de paramètres à partir de cet emplacement.

7
lanzz

Je suis venu à cette question via Google, donc je vais répondre à ce qui m'a aidé (pas directement liée à la question).

J'utilise importlib pour importer dynamiquement des sous-packages donnés par une chaîne.

import importlib
module_name = 'subpackage.i.import'
special_module = importlib.import_module(module_name, package=None)

Cela doit simplement être ajusté pour

import importlib
module_name = 'subpackage.i.import'
special_module = importlib.import_module(module_name, package='my_current_pkg)
5
Martin Thoma
  1. les paramètres que vous avez définis dans uwsgi.py peuvent ne pas être corrects
  2. le chemin des paramètres dans uwsgi.py (XXXX est dans le même répertoire que uwsgi.py):

    os.environ.setdefault ("Django_SETTINGS_MODULE", "XXXX.settings")

0
jammyWolf