web-dev-qa-db-ja.com

相対インポートには「パッケージ」引数が必要です

Sphinxを使用して、pythonコードのpydocを自動的に生成できるようにしたいのですが、エラーが発生します。どうすればよいですか?

conf.py 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 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 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.
16
ogward

Django_SETTINGS_MODULEは、ファイルシステムパスではなく Pythonモジュール識別子 である必要があります。 Django/conf/__init__pyファイルを見ると、設定モジュールへの相対パスが機能していないようです。 sys.pathにリストされているディレクトリの下に移動するか、sys.pathに親ディレクトリを追加して、そこから設定モジュールを参照する必要があります。

7
lanzz

私はGoogle経由でこの質問に来たので、助けになったことに答えます(質問とは直接関係ありません)。

importlib を使用して、文字列で指定されたサブパッケージを動的にインポートします。

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

これは単に調整する必要があります

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

設定ファイル名を指定している場所にタイプミスがある場合にも、このエラーが発生する可能性があります。

0
Jan Kyu Peblik
  1. uwsgi.pyで設定した設定が正しくない可能性があります
  2. uwsgi.pyの設定パス(XXXXはuwsgi.pyと同じディレクトリにあります):

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

0
jammyWolf