如何从第一个 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

从一个脚本调用另一个脚本的方法之一是使用 subprocess.Popen 线上的东西

   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 中的 return 值通过通信方法使调用同步。

  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

在被调用脚本中使用 subprocess as

     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 的方法,但是那些不是每次都改变吗?

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

ret.pid

如果是 运行

,则可以使用 .terminate 终止进程
ret.terminate()

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

ret.poll()

poll 将 return 一个 None 如果进程是 运行

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

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 模块)

另一方面,如果您需要在两个脚本之间动态交换某些东西(虽然都是 运行ning),您可以使用管道机制,甚至更好,使用 multiprocessing (这需要对您当前的代码进行一些更改),它会使与它的通信和控制(终止它)更加清晰。

您可以通过命令行、环境变量或在标准输入上传递数据来将变量传递给子进程。对于不太长且本身没有 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()