Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从第一个python脚本启动两个python脚本,然后立即终止它们?_Python_Python 3.x_Python 3.4 - Fatal编程技术网

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

如何从第一个python脚本启动两个python脚本,然后立即终止它们?,python,python-3.x,python-3.4,Python,Python 3.x,Python 3.4,我在一个python脚本中有一个函数,它应该多次启动另一个python脚本,我假设可以这样做(脚本只是我对如何工作的想象) 但是,我还需要将一些定义的变量传递到另一个脚本中,例如,如果 x = 1 在第一个脚本中,我需要x在第二个脚本中具有相同的值,而不在那里定义它,我不知道如何做到这一点 然后也杀了他们,我读过一些使用PIDs的方法,但这些不是每次都会改变吗 我在谷歌上找到的大多数方法看起来过于复杂,我想做的事情其实很简单。有谁能指引我正确的方向去使用什么以及我应该如何去完成它 我在一个py

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

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

x = 1
在第一个脚本中,我需要x在第二个脚本中具有相同的值,而不在那里定义它,我不知道如何做到这一点

然后也杀了他们,我读过一些使用PIDs的方法,但这些不是每次都会改变吗


我在谷歌上找到的大多数方法看起来过于复杂,我想做的事情其实很简单。有谁能指引我正确的方向去使用什么以及我应该如何去完成它

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

** 下面是子流程手册页面,其中包含了我将要讨论的所有内容

从另一个脚本调用一个脚本的方法之一是使用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的返回值,使用communicate方法使调用同步

  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参数

  • 您可以使用args解析

  • 向子流程传递可用于配置子流程的环境变量。这很快,但只有一种方式有效,即从父进程到子进程。 在被调用脚本中

     import os
     x = int(os.enviorn('xvalue'))
    
  • 在被调用方脚本中设置环境变量

        import os
        int x = 1
        os.environ['xvalue'] = str(x)
    
  • 使用插座、管道或其他IPC方法
  • 然后杀死它们,我读过一些使用PIDs的方法,但这些方法不是每次都会改变吗?

    同样,您可以使用subprocess保存进程id并终止它 这将为您提供进程id

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

    ret.terminate()
    
    要检查进程是否正在运行,可以使用subprocess 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(使用模块)


    另一方面,如果您需要在两个脚本之间动态地交换某些内容(当两个脚本都在运行时),您可以使用管道机制,或者更好地使用(需要对当前代码进行一些更改),它将与它进行通信并控制它(终止它)更干净。

    您可以通过命令行、环境变量或在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()
    

    但是被调用的脚本包含一个无限while循环,我需要一种方法来终止它,我真的不知道如何使用它将变量传递到另一个脚本上,你能详细说明我将如何做到吗?更新了答案。您可以随时查看手册页面了解更多信息好的,使用您的帖子,我完全按照我的意思做了,减去一件事,比如说,我执行5个进程(都在ret变量下),然后执行ret.terminate(),只有最后打开的进程关闭,其中4个我无法关闭,我怎么能只用一个命令就关闭剩下的4个呢?我想有一个答案可以解释这一点。无论何时在不同索引处调用pOpen,都将返回的对象存储在列表或字典中。现在,因为所有创建的进程都有对象,所以您可以根据需要终止任何进程。这篇文章中有一个答案是关于如何使用
    多处理.Pool
    ?然后可以使用
    map\u async
    传递参数,或
    terminate
    完成参数传递。
    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()