Résumé : Lors de l'exécution d'un programme Python, la console affiche des informations utiles. Afin de sauvegarder les informations de manière pratique, il est parfois nécessaire de sauvegarder les informations.
Raiders historiques :
Python : encapsuler le module de journalisation et les références
Python : module de sous-processus
Origine : La ligne de commande exécute ping ip, l'exigence est d'enregistrer le processus de contenu ping dans un fichier
ping www.baidu.com
Résultat de sortie :
正在 Ping www.baidu.com [163.177.151.110] 具有 32 字节的数据:
来自 163.177.151.110 的回复: 字节=32 时间=22ms TTL=56
来自 163.177.151.110 的回复: 字节=32 时间=14ms TTL=56
来自 163.177.151.110 的回复: 字节=32 时间=13ms TTL=56
来自 163.177.151.110 的回复: 字节=32 时间=12ms TTL=56
163.177.151.110 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 12ms,最长 = 22ms,平均 = 15ms
Transformez en un script Python :
# -*- coding: utf-8 -*-
# time: 2022/7/31 11:26
# file: main.py
# 公众号: 玩转测试开发
import os
cmd = "ping www.baidu.com"
message = os.system(cmd)
print("*" * 100)
print(message)
Exécutez le résultat du script :
正在 Ping www.baidu.com [163.177.151.110] 具有 32 字节的数据:
来自 163.177.151.110 的回复: 字节=32 时间=11ms TTL=56
来自 163.177.151.110 的回复: 字节=32 时间=12ms TTL=56
来自 163.177.151.110 的回复: 字节=32 时间=12ms TTL=56
来自 163.177.151.110 的回复: 字节=32 时间=13ms TTL=56
163.177.151.110 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 11ms,最长 = 13ms,平均 = 12ms
****************************************************************************************************
0
Le problème qui en résulte est que l'exigence est de sauvegarder les données de la console sous forme de variable, et le résultat obtenu est, le résultat sous l'astérisque : 0, ce qui ne correspond pas au résultat que nous souhaitons. la raison est
Solution 1 : Passez le cas subprocess.check_output() : exécutez la commande, retournez le résultat de l'exécution, au lieu d'imprimer
# -*- coding: utf-8 -*-
# time: 2022/7/31 11:26
# file: main.py
# 公众号: 玩转测试开发
import subprocess
cmd = "ping www.baidu.com"
message = subprocess.check_output(cmd)
print("*" * 100)
print(message.decode(encoding='gbk'))
Résultat de l'exécution : si vous rencontrez des caractères chinois tronqués, reportez-vous à la commande dos de l'interface pycharm Gestion des problèmes de cryptage chinois
****************************************************************************************************
正在 Ping www.baidu.com [163.177.151.109] 具有 32 字节的数据:
来自 163.177.151.109 的回复: 字节=32 时间=12ms TTL=56
来自 163.177.151.109 的回复: 字节=32 时间=69ms TTL=56
来自 163.177.151.109 的回复: 字节=32 时间=12ms TTL=56
来自 163.177.151.109 的回复: 字节=32 时间=87ms TTL=56
163.177.151.109 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 12ms,最长 = 87ms,平均 = 45ms
La situation ci-dessus peut couvrir la plupart des scénarios. Lorsque des lignes de commande individuelles sont exécutées, la sortie sera vide, comme
Cas d'origine 2 :
# -*- coding: utf-8 -*-
# time: 2022/7/31 11:26
# file: main.py
# 公众号: 玩转测试开发
import subprocess
cmd = "locust -f pressure_test.py --headless --users 100 --spawn-rate 1 -H http://127.0.0.1:7890 --run-time 5s"
message = subprocess.check_output(cmd)
print("*" * 100)
print(message.decode(encoding='gbk'))
Résultat de l'exécution : le message de sortie est vide.
[2022-07-31 11:43:10,811] LAPTOP-3FI0HAN5/INFO/locust.main: Run time limit set to 5 seconds
[2022-07-31 11:43:10,811] LAPTOP-3FI0HAN5/INFO/locust.main: Starting Locust 2.1.0
[2022-07-31 11:43:10,811] LAPTOP-3FI0HAN5/INFO/root: Terminal was not a tty. Keyboard input disabled
Name # reqs # fails | Avg Min Max Median | req/s failures/s
----------------------------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Aggregated 0 0(0.00%) | 0 0 0 0 | 0.00 0.00
[2022-07-31 11:43:10,812] LAPTOP-3FI0HAN5/INFO/locust.runners: Ramping to 100 users at a rate of 1.00 per second
Name # reqs # fails | Avg Min Max Median | req/s failures/s
----------------------------------------------------------------------------------------------------------------------------------------------------------------
GET /hello 193 0(0.00%) | 11 7 26 10 | 0.00 0.00
GET /world 193 0(0.00%) | 4 1 13 2 | 0.00 0.00
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Aggregated 386 0(0.00%) | 7 1 26 9 | 0.00 0.00
Name # reqs # fails | Avg Min Max Median | req/s failures/s
----------------------------------------------------------------------------------------------------------------------------------------------------------------
GET /hello 431 0(0.00%) | 14 7 29 15 | 52.50 0.00
GET /world 429 0(0.00%) | 8 1 22 9 | 52.50 0.00
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Aggregated 860 0(0.00%) | 11 1 29 10 | 105.00 0.00
[2022-07-31 11:43:15,079] LAPTOP-3FI0HAN5/INFO/locust.main: Time limit reached. Stopping Locust.
[2022-07-31 11:43:15,081] LAPTOP-3FI0HAN5/INFO/locust.main: Running teardowns...
[2022-07-31 11:43:15,081] LAPTOP-3FI0HAN5/INFO/locust.main: Shutting down (exit code 0), bye.
[2022-07-31 11:43:15,081] LAPTOP-3FI0HAN5/INFO/locust.main: Cleaning up runner...
Name # reqs # fails | Avg Min Max Median | req/s failures/s
----------------------------------------------------------------------------------------------------------------------------------------------------------------
GET /hello 462 0(0.00%) | 15 7 34 15 | 108.48 0.00
GET /world 461 0(0.00%) | 9 1 30 9 | 108.24 0.00
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Aggregated 923 0(0.00%) | 12 1 34 11 | 216.72 0.00
Response time percentiles (approximated)
Type Name 50% 66% 75% 80% 90% 95% 98% 99% 99.9% 99.99% 100% # reqs
--------|--------------------------------------------------------------------------------|---------|------|------|------|------|------|------|------|------|------|------|------|
GET /hello 15 16 17 19 23 24 29 32 34 34 34 462
GET /world 9 10 11 12 17 19 25 28 30 30 30 461
--------|--------------------------------------------------------------------------------|---------|------|------|------|------|------|------|------|------|------|------|------|
None Aggregated 11 15 16 17 21 24 27 30 34 34 34 923
****************************************************************************************************
Solution 1 mise à jour : subprocess.getstatusoutput(), qui accepte une commande sous la forme d'une chaîne et renvoie un résultat sous la forme d'un tuple, le premier élément est l'état d'exécution de la commande et le second est le résultat de l'exécution.
# -*- coding: utf-8 -*-
# time: 2022/7/31 11:26
# file: main.py
# 公众号: 玩转测试开发
import subprocess
cmd = "locust -f pressure_test.py --headless --users 100 --spawn-rate 1 -H http://127.0.0.1:7890 --run-time 5s"
message, out = subprocess.getstatusoutput(cmd)
print("*" * 100)
print(message)
print("*" * 100)
file = "locust_test_report.txt"
with open(file, "w")as f:
f.write(out)
print(f"进入文件{file}完毕")
Résultats du :
Solution mise à jour 2 :
subprocess.Popen(shell=True, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, universal_newlines=True, bufsize=1)
# -*- coding: utf-8 -*-
# time: 2022/7/30 17:00
# file: test1700.py
# 公众号: 玩转测试开发
# -*- coding: UTF8 -*-
import subprocess
# 常用编码
GBK = 'gbk'
UTF8 = 'utf-8'
# 解码方式,一般 py 文件执行为utf-8 ,cmd 命令为 gbk
current_encoding = GBK
popen = subprocess.Popen(
'locust -f pressure_test.py --headless --users 100 --spawn-rate 1 -H http://127.0.0.1:7890 --run-time 20s',
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
universal_newlines=True,
bufsize=1)
# 执行
out, err = popen.communicate()
print('std_err: ' + err)
file = "test.txt"
with open(file, "w", encoding="utf-8")as f_obj:
f_obj.write(err)
Résultats du :