繁体   English   中英

如何从第一个python脚本启动几个python脚本,然后立即终止它们?

[英]How to launch a couple of python scripts from a first python script and then terminate them all at once?

我在python脚本中有一个函数,该函数应该多次启动另一个python脚本,我假设可以这样做(脚本只是我对它如何工作的想象。)

iterations = input("Enter the number of processes to run")
for x in range(0, iterations):
    subprocess.call("python3 /path/to/the/script.py", shell=True)

但是,我还需要将一些已定义的变量传递到其他脚本中,例如,如果

x = 1

在第一个脚本中,然后,我需要x在第二个脚本中具有相同的值而不在此定义它,我不知道该怎么做。

然后杀死它们,我已经读过一些使用PID的方法,但是不是每次都会改变吗?

我在Google上发现的大多数方法看起来都过于复杂,而我想做的事情却非常简单。 谁能指导我正确使用和使用什么方法?

我在python脚本中有一个函数,该函数应该多次启动另一个python脚本,我假设可以这样做(脚本只是我对它如何工作的想象。)

**这是子流程手册页,其中包含我将要谈论的所有内容https://docs.python.org/2/library/subprocess.html

调用另一个脚本的一种方法是使用子进程。

   import subprocess
   for i in range(0,100):
       ret = subprocess.Popen("python3 /path/to/the/script.py",stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)

您可以使用Open的返回值来使用communication方法使呼叫同步。

  out,err = ret.communicate()

这将阻塞调用脚本,直到子进程完成。

我还需要将一些已定义的变量传递到另一个脚本中?

有多种方法可以做到这一点。 1.将参数传递给被调用的脚本,并使用OptionPraser或sys.args对其进行解析,所调用脚本中的内容类似于

     from optparse import OptionParser
     parser = OptionParser()
     parser.add_option("-x","--variable",action="store_true",dest="xvalue",default=False)
     (options,args) = parser.parse_args()

     if options.xvalue == True:
          ###do something

在被调用方脚本中,将子进程用作

     ret = subprocess.Popen("python3 /path/to/the/script.py -x",stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)

请注意-x参数的添加

  1. 您可以使用args解析

    https://docs.python.org/2/library/argparse.html#module-argparse

  2. 向子流程传递一个可用于配置子流程的环境变量。 这是快速的,但这仅是一种方法,即从父进程到子进程。 在被叫脚本中

      import os x = int(os.enviorn('xvalue')) 

在被调用者脚本中设置环境变量

    import os
    int x = 1
    os.environ['xvalue'] = str(x)
  1. 使用插座或管道或其他IPC方法

然后杀死它们,我已经读过一些使用PID的方法,但是不是每次都会改变吗?

再次,您可以使用子进程来保存进程ID并终止它,这将为您提供进程ID

ret.pid

然后,您可以使用.terminate终止正在运行的进程

ret.terminate()

要检查进程是否正在运行,可以使用子进程Popen中的poll方法。 我建议您在终止过程之前先检查一下

ret.poll()

如果进程正在运行,则poll将返回None

如果只需要将一些值传递给第二个脚本,并且需要通过子流程模块运行该值,则可以简单地将变量作为命令行参数传递:

for x in range(0, iterations):
    subprocess.call('python3 /path/to/second_script.py -x=%s'%x, shell=True)

并通过second_script.py中的sys.argv列表接收-x = 1(使用argparse模块)

另一方面,如果您需要在两个脚本之间动态交换内容(当两个脚本都在运行时),则可以使用管道机制甚至更好的方法,使用多处理 (在当前代码中需要进行一些更改),这将使与之通信并对其进行控制(终止)更加清洁。

您可以通过命令行将变量传递到子流程,环境变量或在stdin上传递数据。 命令行对于不太长且本身没有shell元字符的简单字符串来说很容易。 目标脚本会将它们从sys.argv拉出。

script.py:

import sys
import os
import time

x = sys.argv[1]
print(os.getpid(), "processing", x)
time.sleep(240)

subprocess.Popen启动子进程,但不等待它们完成。 您可以启动所有子项,将其popen对象放入列表中,然后再进行处理。

iterations = input("Enter the number of processes to run")
processes = []
for x in range(0, iterations):
    processes.append(subprocess.Popen([sys.executable, "/path/to/the/script.py", str(x)])
time.sleep(10)
for proc in processes:
    if proc.poll() is not None:
        proc.terminate()

for proc in processes:
    returncode = proc.wait()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM