版本:
我有一个使用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)
我在这里看到了类似的问题,但没有一个答案解决了这个问题。
我尝试过/考虑了几件事:
import mypkg
main.py
- 同样的错误
客户mypkg
中的mypkg.myapp
而不是INSTALLED_APPS
- 同样的错误答案 0 :(得分:0)
您是否检查过您的应用是否出现在venv已安装的软件包文件夹中? 它应该像
.../venv/lib/python3.5/site-packages
如果有,请检查文件以查看是否存在奇怪的内容。 如果它没有,那么包装就没有安装。
编辑:当然你的Python文件夹可能是3.6