从使用Django作为ORM的包导入会产生ModuleNotFoundError

时间:2018-03-06 18:12:31

标签: packages django-orm

版本:

  • Django 2.0.3
  • Python3.6.3

我有一个使用django作为ORM的包(mypkg)。

我想在客户端脚本(client / myclient / main.py)中使用该包。

我能够直接在客户端应用程序中使用Django ORM - 问题是当我想在多个客户端应用程序使用的包中使用它时。

包裹代码如下:

# ./mypkg_wrapper/mypkg/mypkg/settings.py

INSTALLED_APPS = [
    'django.contrib.contenttypes',
    'myapp',
]

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

SECRET_KEY = '...'

# mypkg/myapp/models.py

from django.db import models


class Post(models.Model):
    title = models.CharField(max_length=200)

# mypkg_wrapper/setup.py
#!/usr/bin/env python
import os
from setuptools import find_packages, setup

# allow setup.py to be run from any path
os.chdir(os.path.normpath(os.path.join(os.path.abspath(__file__), os.pardir)))

setup(
    name='mypkg',
    version='0.0.1',
    packages=find_packages(),
    include_package_data=True,
    description='A django ORM package.',
    install_requires=['django', 'pytz']
)

我运行makemigrations,迁移以设置数据库。

我运行了python setup.py sdist,创建了mypkg_wrapper/dist/mypkg-0.0.1.tar.gz

客户代码:

# myclient/settings.py

INSTALLED_APPS = [
    'django.contrib.contenttypes',
    'mypkg.myapp',
]

SECRET_KEY = '...'

# myclient/main.py
if __name__ == '__main__':
    import os
    from os.path import abspath, dirname, join
    import sys
    import django

    sys.path.append(join(abspath(dirname(__file__)), '..'))
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'settings')
    django.setup()

    import mypkg.myapp

在客户端venv中,我运行了pip install ../mypkg_wrapper/mypkg-0.0.1.tar.gz,这似乎成功安装了mypkg软件包。

然后我尝试运行python myclient/main.py,尝试导入mypkg.myapp时出现以下错误。

ModuleNotFoundError: No module named 'mypkg'

mypkg包位于客户端的venv:

$ pip list
Django (2.0.3)
mypkg (0.0.1)
pip (9.0.1)
pytz (2018.3)
setuptools (28.8.0)

我在这里看到了类似的问题,但没有一个答案解决了这个问题。

我尝试过/考虑了几件事:

    {li> import mypkg main.py - 同样的错误 客户mypkg中的
  1. mypkg.myapp而不是INSTALLED_APPS - 同样的错误
  2. 不确定是否需要在每个客户端创建数据库?数据库如何跨包的多个客户端工作?

1 个答案:

答案 0 :(得分:0)

您是否检查过您的应用是否出现在venv已安装的软件包文件夹中? 它应该像

.../venv/lib/python3.5/site-packages

如果有,请检查文件以查看是否存在奇怪的内容。 如果它没有,那么包装就没有安装。

编辑:当然你的Python文件夹可能是3.6