如何从 views.py 以 Popen() 开始的脚本导入 Django 模型?

How to import Django models from script started with Popen() from views.py?

我想在某个请求到达我的 Django 服务器时在不同的进程中启动一个 python 脚本。 我可以成功启动它,但是导入失败。

在我的 django 应用程序中,我有一个 views.py。 在这里,我有一个 ViewSet 和一个 update() 方法,看起来像这样(减少相关代码的片段):

from . import models # notice this import, which works

def update(self, request, pk=None):
    dirname = os.path.dirname(__file__)
    filename = os.path.join(dirname, 'Process.py')
    p = subprocess.Popen(["python", filename],
                         stdout=sys.stdout, 
                         stdin=subprocess.PIPE)

这按预期工作:当执行导致调用 update() 的适当请求时,它会执行 Process.py,这是与 views.py 相同目录中的文件。

Process.py中,我想访问django后端的models,所以和之前一样:

from . import models

# more code here

但是我得到错误:

ImportError: cannot import name 'models'

为什么此导入在 Process.py 中失败,即使它适用于 views.py

我试过了

如何成功导入(和使用) app from a python script that's started with subprocess.Popen(...) from views.py of models.py


来自评论

Is Process.py a regular Python script, or is it written as a Django Management Command?

楷书。 我出于调试目的修改了它:

import sys
for p in sys.path:
    print(p)

from . import models

What happens if you run the script manually from the shell? Same error?

from shell django views.py via Popen()
windows cmd: django-project>python manage.py shell then In [1]: from django-app import Process see above call detail
success ImportError: cannot import name 'models' result
includes django-project path and empty path includes django-project/django-app differences of sys.path

可能您缺少对 Django 应用程序 的引用,要从中导入所有模型,您必须在 python 脚本:

from <django-app-name>.models import *

Process.py 应该是一个 Django Management Command,这样 Django Framework 就会被加载并且 model.py 被 Django 使用。

PYTHONPATH 仍然是必需的,以便 Django 知道基本目录在哪里。

Instad of ["python", filename],进程可以从 ["python", "manage.py", filename] 开始。