python - 当我执行 subprocess.Popen 时,Django 没有将数据插入数据库

标签 python django subprocess

我正在使用 django 并将数据插入数据库并下载图像。当我调用该函数时,它工作正常,但它会阻塞主线程。要在后台执行该进程,我正在使用:

views.py:

类 get_all_data( View ): def post(self, request, *args, **kwargs):

subprocess.Popen(
            ['python get_images.py --data=data'],
            close_fds=True,
            shell = True
        )

但是当我打电话时:

python get_images.py(data="data")

它工作正常,但它在主线程上运行。

我该如何修复它?顺便说一句,我正在使用 python 2.7

注意:请不要推荐 Celery 。我正在寻找运行异步任务或任何其他替代方案的东西。

我使用以下代码插入我的数据库:

get_images.py:

from models import Test


        def get_image_all():

            #get data from server
            insert_to_Test(data="data")



        if __name__ == "__main__":
            import argparse
            from  .models import Test
            import django
            django.setup()

            parser = argparse.ArgumentParser()
            parser.add_argument('--from_date')
            parser.add_argument('--data')
            parser.add_argument('--execute', type=bool, default=False)
            args = parser.parse_args()
            print "args", args
            get_image_all(**vars(args))

当我调用 subprocess.Popen 时,它不会将数据插入到我的数据库中,但如果我通过调用该函数来执行它,那么它会将数据插入到数据库中。为什么会发生这种情况?

最佳答案

  • 首先,导入并使用 Django 模型之后 django.setup()
  • 其次,确保spawn进程运行的环境正确,主要是确保在正确的virtualenv中使用正确的Python解释器(如果使用的话),并确保进程运行在正确的工作目录

示例代码:

if __name__ == "__main__":

    import argparse
    import django
    django.setup()

    from  .models import Test

    # Parse args
    # Use Django models

接下来,您需要确保 subprocess 在正确的工作目录中运行,并激活您的 Python virtualenv(如果有),大致如下所示:

subprocess.Popen(
    '/path/to/virtualenv/bin/python get_images.py --data=data', 
    cwd='/path/to/project/working_directory/',
    shell=True
)

关于python - 当我执行 subprocess.Popen 时,Django 没有将数据插入数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44385427/

相关文章:

python mysql数据库连接错误

python - 如何找到椭圆内的点?

Django - 转储数据截断到最后 n 行

python - 控制 Django 中的原子事务

java - 从 Java 运行 bash

python - 如何交换日期时间对象中的月份和日期?

python - 路径相关切片-功能代码修改

python - 我可以 git 忽略整个分支来创建与实时服务器交互的本地分支,并将调试设置为 True 吗?

python - 使用 Python popen 的奇怪位数问题

python - 从 python 子进程运行 linux grep 命令