[英]How to launch multiple other python scripts all together from one and send them arguments?
[英]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参数的添加
您可以使用args解析
https://docs.python.org/2/library/argparse.html#module-argparse
向子流程传递一个可用于配置子流程的环境变量。 这是快速的,但这仅是一种方法,即从父进程到子进程。 在被叫脚本中
import os x = int(os.enviorn('xvalue'))
在被调用者脚本中设置环境变量
import os
int x = 1
os.environ['xvalue'] = str(x)
然后杀死它们,我已经读过一些使用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.