在 2017年3月27日星期一 UTC+8下午3:43:27,Edward K. Ream写道: > > On Sun, Mar 26, 2017 at 11:24 PM, huliuhe <[email protected] <javascript:>> > wrote: > >> I create a button node : @button test . and write the python code: >> > > Use Python's subprocess module > <https://docs.python.org/2/library/subprocess.html> if you are going to > run just one process and wait for the result. For example: > > proc = subprocess.Popen( > command, > stdout=subprocess.PIPE, > shell=False, > universal_newlines=True, # Converts stdout to unicode > ) > # wait > stdout_data, stderr_data = proc.communicate() > > To run multiple processes without blocking Leo, use > g.app.backgroundProcessManager, a singleton instance of the > BackgroundProcessManager class in leoBackground.py. > > This @file node was omitted by accident from leoPyRef.leo in Leo 5.5 > final. I restored it several days ago on Leo's git repository. To restore > this node by hand, create it in your leoPy.leo and use refresh-from-disk. > > Here is the docstring from that class: > > The BackgroundProcessManager (BPM) class runs background processes, > *without blocking Leo*. The BPM manages a queue of processes, and runs them > *one at a time* so that their output remains separate. > > g.app.backgroundProcessManager is the singleton BPM. > > The BPM registers a handler with the IdleTimeManager that checks whether > the presently running background process has completed. If so, the handler > writes the process's output to the log and starts another background > process in the queue. > > BPM.start_process(c, command, kind, fn=None, shell=False) adds a process > to the queue that will run the given command. > > BM.kill(kind=None) kills all process with the given kind. If kind is None > or 'all', all processes are killed. > > You can add processes to the queue at any time. For example, you can rerun > the 'pylint' command while a background process is running. > > The BackgroundProcessManager is completely safe: all of its code runs in > the main process. > > **Running multiple processes simultaneously** > > Only one process at a time should be producing output. All processes that > *do* produce output should be managed by the singleton BPM instance. > > To run processes that *don't* produce output, just call subprocess.Popen. > You can run as many of these process as you like, without involving the BPM > in any way. > > *Example* The node: > > leoPy.leo#Code-->Command classes-->@file > ../commands/checkerCommands.py-->class PylintCommand-->pylint.run_pylint > > contains the code that runs pylint. self.wait is False, so after setting > up the desired pylint command the code just executes: > > bpm = g.app.backgroundProcessManager > bpm.start_process(c, command, kind='pylint', fn=fn) > > Setting up the command can be a bit tricky. Note that you may have to use > shlex, depending on platform. > > HTH. > > Edward >
Thanks. I 'll try it. -- You received this message because you are subscribed to the Google Groups "leo-editor" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at https://groups.google.com/group/leo-editor. For more options, visit https://groups.google.com/d/optout.
