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

Ana*_*and 5 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']
)
Run Code Online (Sandbox Code Playgroud)

我运行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
Run Code Online (Sandbox Code Playgroud)

在客户端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)
Run Code Online (Sandbox Code Playgroud)

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

我试过/考虑了几件事:

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

Mar*_*tin 0

您是否检查过您的应用程序是否出现在 venv 安装的软件包文件夹中?应该是这样的

.../venv/lib/python3.5/site-packages
Run Code Online (Sandbox Code Playgroud)

如果存在,请检查文件,看看是否有奇怪的东西。如果不存在,则该软件包未安装。

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