如何检查并等待上一个文件完成并执行下一个文件
How to check and wait previous file is completed and execute next files
系统:Linux、Ubuntu
我有几个文件需要顺序执行(执行命令 iperf),我创建了一个 main.py 文件并导入了这些文件,
在所有 iperf 完成后,需要重置设置(文件:reset.py)。
而这些文件中的其中一个文件需要从头到尾在reset.py之前运行(以获取cpu日志),所以我使用后台执行,代码如下:
r = os.system('python3 getcpu.py &)
print(r)
问题是,我尝试控制计时器(例如:time.sleep() 或线程..等)无法使 reset.py 运行 在 getcpu.py 之后,
我如何检查文件 getcpu.py 是否已完成,然后 运行 下一个文件 (reset.py)?
我画的结构如下:
=====更新下面的代码和说明=====
B因为完整的代码有点长,我把关键点贴在这里。
我需要在运行所有iperf命令时获取cpu日志,我使用的是后台工作方式,这样程序就可以同步执行了。
from Modules.ConfigModule import * # preset settings
def get_cpu(): # background execution
r = os.system('python3 getcpu.py &')
print(r)
get_cpu()
from Iperf1 import *
from Iperf2 import *
from Iperf3 import *
from Iperf4 import *
from Modules.resetModule import *
下面的文件 getcpu.py 命令:
# SSH connection
stdin, stdout, stderr = ssh.exec_command('mpstat -P ALL 1400')
info = stdout.readlines()
print(info)
# I set 1400 sec. because I want to make sure get complete cpu report
您可以尝试使用 subprocess.run()
而不是 os.system()
。
它会阻止执行,直到进程完成。
import subprocess
r = subprocess.run(['python3', 'getcpu.py'])
print(r.returncode)
https://docs.python.org/3/library/subprocess.html#subprocess.run
根据新信息,您可以使用 psutil 包和线程自己编写分析器,如下所示:
import psutil
from threading import Thread
import time
class Profiler:
def __init__(self):
self.stop = False
self.thread = Thread(target=self.do_profile)
def profile_start(self):
self.thread = Thread(target=self.do_profile)
self.thread.start()
def profile_stop(self):
self.stop = True
self.thread.join()
def do_profile(self):
while not self.stop:
print(psutil.cpu_percent())
time.sleep(0.1) #delay between cpu collections
self.stop = False
p = Profiler()
p.profile_start()
print("Importing Module 1")
from pandas import *
print("Importing Module 2")
from PySide2 import *
print("Importing Module 3")
from matplotlib import *
p.profile_stop()
这会打印
Importing Module 1
0.0
23.2
40.4
14.3
32.1
10.7
12.5
7.1
10.5
14.0
7.1
14.3
7.0
26.3
14.0
8.9
Importing Module 2
7.0
26.8
7.1
16.3
17.2
10.7
18.8
17.9
21.4
14.3
17.9
21.4
0.0
5.4
10.7
12.5
10.7
22.8
10.7
8.9
22.8
Importing Module 3
10.5
21.1
当然,您可以编辑 do_profile
函数以根据需要格式化输出。我选择获得 CPU 百分比。但还有其他统计数据。
看这里:https://pypi.org/project/psutil/
希望对您有所帮助!
系统:Linux、Ubuntu
我有几个文件需要顺序执行(执行命令 iperf),我创建了一个 main.py 文件并导入了这些文件, 在所有 iperf 完成后,需要重置设置(文件:reset.py)。 而这些文件中的其中一个文件需要从头到尾在reset.py之前运行(以获取cpu日志),所以我使用后台执行,代码如下:
r = os.system('python3 getcpu.py &)
print(r)
问题是,我尝试控制计时器(例如:time.sleep() 或线程..等)无法使 reset.py 运行 在 getcpu.py 之后, 我如何检查文件 getcpu.py 是否已完成,然后 运行 下一个文件 (reset.py)?
我画的结构如下:
=====更新下面的代码和说明=====
B因为完整的代码有点长,我把关键点贴在这里。 我需要在运行所有iperf命令时获取cpu日志,我使用的是后台工作方式,这样程序就可以同步执行了。
from Modules.ConfigModule import * # preset settings
def get_cpu(): # background execution
r = os.system('python3 getcpu.py &')
print(r)
get_cpu()
from Iperf1 import *
from Iperf2 import *
from Iperf3 import *
from Iperf4 import *
from Modules.resetModule import *
下面的文件 getcpu.py 命令:
# SSH connection
stdin, stdout, stderr = ssh.exec_command('mpstat -P ALL 1400')
info = stdout.readlines()
print(info)
# I set 1400 sec. because I want to make sure get complete cpu report
您可以尝试使用 subprocess.run()
而不是 os.system()
。
它会阻止执行,直到进程完成。
import subprocess
r = subprocess.run(['python3', 'getcpu.py'])
print(r.returncode)
https://docs.python.org/3/library/subprocess.html#subprocess.run
根据新信息,您可以使用 psutil 包和线程自己编写分析器,如下所示:
import psutil
from threading import Thread
import time
class Profiler:
def __init__(self):
self.stop = False
self.thread = Thread(target=self.do_profile)
def profile_start(self):
self.thread = Thread(target=self.do_profile)
self.thread.start()
def profile_stop(self):
self.stop = True
self.thread.join()
def do_profile(self):
while not self.stop:
print(psutil.cpu_percent())
time.sleep(0.1) #delay between cpu collections
self.stop = False
p = Profiler()
p.profile_start()
print("Importing Module 1")
from pandas import *
print("Importing Module 2")
from PySide2 import *
print("Importing Module 3")
from matplotlib import *
p.profile_stop()
这会打印
Importing Module 1
0.0
23.2
40.4
14.3
32.1
10.7
12.5
7.1
10.5
14.0
7.1
14.3
7.0
26.3
14.0
8.9
Importing Module 2
7.0
26.8
7.1
16.3
17.2
10.7
18.8
17.9
21.4
14.3
17.9
21.4
0.0
5.4
10.7
12.5
10.7
22.8
10.7
8.9
22.8
Importing Module 3
10.5
21.1
当然,您可以编辑 do_profile
函数以根据需要格式化输出。我选择获得 CPU 百分比。但还有其他统计数据。
看这里:https://pypi.org/project/psutil/
希望对您有所帮助!