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 oscmd = "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 subprocesscmd = "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 subprocesscmd = "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 :

image

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 命令为 gbkcurrent_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 :

image