如何从第一个python脚本启动两个python脚本,然后立即终止它们?
我在一个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
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参数
import os
x = int(os.enviorn('xvalue'))
import os
int x = 1
os.environ['xvalue'] = str(x)
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()