2014-03-04 5 views
12

Ich möchte Sphinx verwenden, damit es automatisch einen pydoc für meinen Python-Code generieren kann, aber ich bekomme einen Fehler. Was mache ich falsch?Relative Importe erfordern das Argument 'package'

conf.py Sphinx Konfigurationsdatei

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 django Datei

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 geworfen Fehler, wenn ich versuche, die HTML-Datei zu machen.

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. 
+1

angepasst werden @lanzz du eine Antwort machen könnte. Es ist sehr genau. – User

Antwort

7

DJANGO_SETTINGS_MODULE wird erwartet, dass ein Python module identifier, kein Dateisystem-Pfad zu sein. Wenn Sie die Datei django/conf/__init__py betrachten, scheint es, dass ein relativer Pfad zu Ihrem Einstellungsmodul dort nicht funktioniert. Sie müssen es unter ein Verzeichnis verschieben, das in Ihrer sys.path aufgeführt ist, oder Sie sollten Ihr sys.path ein übergeordnetes Verzeichnis hinzufügen und von dort auf Ihr Einstellungsmodul verweisen.

0
  1. die Einstellungen kann man in uwsgi.py gesetzt ist nicht korrekt
  2. die Einstellungen Pfad in uwsgi.py (XXXX ist in das gleiche Verzeichnis wie uwsgi.py):

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

3

kam ich auf diese Frage über Google, ich werde so beantworten, was mir geholfen hat (nicht direkt auf die Frage bezogen).

Ich verwende importlib, um Unterpakete dynamisch zu importieren, die von einer Zeichenfolge angegeben werden.

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

hat diese einfach zu

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