[PySide] PySide plus Django: How can I make the PySide application auto-start the server?

Bjørn Helge Kjøsnes bjelge at nefines.com
Mon Sep 10 12:33:09 CEST 2012


Hi,

when you start Django development server with runserver, you are 
starting a process that listens for changes in the Django application 
and reloads the server each time a change is done to a file. If you just 
want the server to start without any reloading, you should add the 
--noreload to your popen. This way you get the real Django server 
process and not the process that listens for file changes and reload.

server = subprocess.Popen(["python", manage_path, "runserver","--noreload"])

https://docs.djangoproject.com/en/1.4/ref/django-admin/#django-admin-option---noreload

This works well for me. I am able to kill the server with the pid I get.

Regards,
Bjørn Helge Kjøsnes


On 07.09.2012 19:20, Zak wrote:
> Thanks for the suggestion. Although it seems like it should work, it 
> does not, it returns the wrong PID. I tried it. In the following 
> example, the correct PID to kill is '3', but subprocess.Popen.pid 
> (a.k.a. server.pid) returns '2'. Here is a shortened example:
>
> import sys
> import subprocess
> from PySide.QtCore import *
> from PySide.QtGui import *
> from PySide.QtWebKit import *
>
> # Create a Qt application
> app = QApplication(sys.argv)
>
> pids = pm.get_python_pids()
> print "PID list 1:"
> print pids
> ## Assuming no other Python things are running,
> ## this prints a list of one PID, e.g. ['1']
>
> # Start the Django server
> server = subprocess.Popen(["python", manage_path, "runserver"])
>
> pids_1 = pm.get_python_pids()
> print "PID list 2:"
> print pids_1
> ## Prints a list of two PIDs, e.g. ['1', '2']
>
> # Enter Qt application main loop
> app.exec_()
>
> # If execution reaches this point, then the GUI window was closed
>
> # To kill the Django server, we must first figure out what
> # its Windows PID is
>
> pids_2 = pm.get_python_pids()
> print "PID list 3:"
> print pids_2
> ## Prints a list of three PIDs, e.g. ['1', '2', '3']
> ## The proper process to kill is whichever one is new in pids_2. That 
> is to
> ## say, we should kill the process which is listed in pids_2 but is not
> ## present in pids_1. In this example, it would be PID '3'.
>
> ## Another idea to find the PID to kill:
> print "Server PID:"
> print server.pid
> ## This doesn't work. In the current example, this prints '2'.
> ## '2' is not the correct PID to kill, the correct PID
> ## is '3' in this example.
>
> # max_kill is the maximum number of processes named 'python.exe' to kill
> max_kill = 1
> for pid in pids_2:
>     if pid in pids_1:
>         continue
>     else:
>         subprocess.call(["taskkill", "/F", "/pid", pid])
>         max_kill -= 1
>     if max_kill == 0:
>         break
>
> # Now exit Python entirely
> sys.exit()
>
> Trying to kill the Django server in this way is equivalent to 
> server.kill() or server.terminate() or 
> server.send_signal(CTRL_C_EVENT). The problem with those three is the 
> same: they send the signal to PID '2', which is simply not the PID of 
> the Django server. It is the PID bound to the Popen instance, but that 
> is not correct.
>
> Zak F.
>
> On 9/7/12 4:33 AM, João Vale wrote:
>> Hi,
>>
>> I think you're overcomplicating things when looking up Django's PID, 
>> the object returned by Popen already provides you that:
>>
>> http://docs.python.org/library/subprocess.html#subprocess.Popen.pid
>>
>> Cheers,
>> João
>>
>>
>>
>> On Thu, Sep 6, 2012 at 6:18 PM, Zak <pyside at m.allo.ws 
>> <mailto:pyside at m.allo.ws>> wrote:
>>
>>     To see my full solution, look at the code below. Here it is
>>     described in
>>     English:
>>
>>     Use the Windows command 'tasklist' to get a list of all running
>>     processes. Unfortunately, several processes are named simply
>>     'python.exe', and I could not find a way to figure out which one
>>     corresponded to manage.py. If you kill the wrong 'python.exe'
>>     process, a
>>     process may essentially kill itself. If the process kills itself
>>     before
>>     it kills manage.py, then manage.py will not be killed at all.
>>
>>     To solve this problem, I ran 'tasklist' several times and kept
>>     track of
>>     when new processes appeared and which PID they had. It turns out that
>>     three 'python.exe' processes are created, and you need to kill
>>     the third
>>     one.
>>
>>     I eventually kill the process using 'taskkill /F /pid %s' %
>>     (pid_to_kill).
>>
>>     Here is the code, simplified and merged into a single file:
>>
>>     import re
>>     import subprocess
>>
>>     pyPat = re.compile("(?m)^python\.exe\s+(?P<pid>\d+)")
>>     # pyPat matches if "python.exe" occurs at the start of a new line
>>     (not in
>>     # the middle), followed by one or more spaces, followed by one or
>>     more
>>     # digits. The digits are stored in the 'pid' group of the match
>>     object.
>>
>>     def get_python_pids():
>>          tasklist = subprocess.check_output(["tasklist"])
>>          pids = []
>>          for mtch in pyPat.finditer(tasklist):
>>              pids.append(mtch.group('pid'))
>>          return pids
>>
>>
>>     import sys
>>     import subprocess
>>     from PySide.QtCore import *
>>     from PySide.QtGui import *
>>     from PySide.QtWebKit import *
>>
>>
>>     # Create a Qt application
>>     app = QApplication(sys.argv)
>>     # Create a browser window and show it
>>     browser = QWebView(None)
>>     browser.load(QUrl("http://127.0.0.1:8000/"))
>>     browser.show()
>>
>>     # pids = pm.get_python_pids()
>>     # print "PID list 1:"
>>     # print pids
>>     ## Assuming no other Python things are running,
>>     ## this prints a list of one PID, e.g. ['1']
>>
>>     # Start the Django server
>>     manage_path = local_settings.root_dir + 'manage.py'
>>     server = subprocess.Popen(["python", manage_path, "runserver"])
>>
>>     pids_1 = pm.get_python_pids()
>>     # print "PID list 2:"
>>     # print pids_1
>>     ## Prints a list of two PIDs, e.g. ['1', '2']
>>
>>     # Enter Qt application main loop
>>     app.exec_()
>>
>>     # If execution reaches this point, then the GUI window was closed
>>
>>     # To kill the Django server, we must first figure out what
>>     # its Windows PID is
>>
>>     pids_2 = pm.get_python_pids()
>>     # print "PID list 3:"
>>     # print pids_2
>>     ## Prints a list of three PIDs, e.g. ['1', '2', '3']
>>     ## The proper process to kill is whichever one is new in pids_2.
>>     That is to
>>     ## say, we should kill the process which is listed in pids_2 but
>>     is not
>>     ## present in pids_1. In this example, it would be PID '3'.
>>
>>     # max_kill is the maximum number of processes named 'python.exe'
>>     to kill
>>     max_kill = 1
>>     for pid in pids_2:
>>          if pid in pids_1:
>>              continue
>>          else:
>>              subprocess.call(["taskkill", "/F", "/pid", pid])
>>              max_kill -= 1
>>          if max_kill == 0:
>>              break
>>
>>     # Now exit Python entirely
>>     sys.exit()
>>
>>     Zak F.
>>     _______________________________________________
>>     PySide mailing list
>>     PySide at qt-project.org <mailto:PySide at qt-project.org>
>>     http://lists.qt-project.org/mailman/listinfo/pyside
>>
>>
>
>
>
> _______________________________________________
> PySide mailing list
> PySide at qt-project.org
> http://lists.qt-project.org/mailman/listinfo/pyside

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/pyside/attachments/20120910/67d92999/attachment.html>


More information about the PySide mailing list