【问题标题】:How can I exit a subprocess that calls a django server?如何退出调用 django 服务器的子进程?
【发布时间】:2019-05-30 11:15:45
【问题描述】:

我正在 localhost:8000 上的 django 服务器上运行 otree erperiment,我想运行一个子进程,在 8080 上启动另一个 django 服务器。 如果首先调用子进程,则浏览器选项卡将不会打开。我怎样才能解决这个问题? 如何退出新服务器(和浏览器选项卡)并返回第一个服务器?

这是一个 oTree 实验。在这个实验过程中,我需要打开另一个 django 项目,特别是我想运行一个 django-oscar 商店。

class MyPage2(Page):

    def before_next_page(self):
       os.environ['DJANGO_SETTINGS_MODULE'] = 'shop.settings'
       subprocess.call(['py', 'shop2/manage.py', 'runserver', '0.0.0.0:8080'], shell=True)
       webbrowser.open('http://localhost:8080', new=2)

【问题讨论】:

    标签: python django server subprocess port


    【解决方案1】:

    解决这个问题有点不同。 我已经放弃了子流程,而是使用 django REST 框架创建了一个 API。来回传递参数(并在同一个浏览器选项卡中工作)是最好的方法。

    【讨论】:

      【解决方案2】:

      我不确定你到底想要什么,但如果你想终止一个子进程,只需调用os.killpg,如下所示:
      试试下面的代码,把call换成Popen

      import os
      import signal
      import subprocess
      
      # The os.setsid() is passed in the argument preexec_fn so
      # it's run after the fork() and before  exec() to run the shell.
      pro = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True, preexec_fn=os.setsid) 
      
      os.killpg(os.getpgid(pro.pid), signal.SIGTERM)  # Send the signal to all the process groups
      

      【讨论】:

      • 我需要终止第二台服务器 (8080) 并关闭新的浏览器选项卡。但是 os.setsid 在 Windows 上不起作用。我尝试了一些替代方法,例如 process.kill(),但我的第二个 django 应用程序(奥斯卡商店)找不到我从第一个 django 应用程序(otree 实验)开始的进程。
      猜你喜欢
      • 1970-01-01
      • 2015-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-17
      • 2010-09-21
      • 2014-05-11
      • 1970-01-01
      相关资源
      最近更新 更多