Создайте функцию python для запуска speedtest-cli/ping в терминале и вывода результата в файл журнала
Я изучаю Python и пытаюсь запустить некоторые терминальные командные строки с использованием Python; Например: тест скорости и пинг. Я использую функциональное программирование в качестве метода программирования. Тем не менее, после прочтения и просмотра с помощью функционального программирования, основанного на docs.python.org 1. Я не думаю, что я делаю это правильно.
Мой вопрос:
Хорошо ли для функции не иметь аргумента / параметров и просто вводить команду / ы непосредственно внутри нее?
И действительно ли это хороший вариант для использования os.system или есть лучший модуль для использования?
Вот пример моего кода.
#!/usr/bin/python3
# tasks.py
import os
def task_speedtest():
os.system("speedtest-cli >> /Desktop/logs")
def task_ping():
os.system("ping www.google.com -c5 >> /Desktop/logs")
task_speedtest()
task_ping()
2 ответа
Что касается вашего первого вопроса, нет ничего плохого в прямом выполнении команд в функции без использования аргументов / параметров в вашей функции.
Вы всегда можете добавить параметр в определение своей функции, чтобы указать путь, например, чтобы вы могли вызвать функцию и выполнить команду, используя разные каталоги:
def task_speedtest(path):
os.system("speedtest-cli >> " + path)
def task_ping():
os.system("ping www.google.com -c5 >> " + path)
path = "/Desktop/logs"
task_speedtest(path)
task_ping(path)
Что касается вашего второго вопроса, да, есть лучший модуль для использования, чем os.system
,
Существует обновленная версия os.system
который Subprocess
Согласно официальной документации Python (Python 3.6):
Модуль подпроцесса позволяет создавать новые процессы, подключаться к их каналам ввода / вывода / ошибок и получать их коды возврата. Этот модуль предназначен для замены нескольких старых модулей и функций.
Рекомендуемый подход к вызову подпроцессов заключается в использовании функции run() для всех случаев использования, которые она может обработать.
subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None)
Запустите команду, описанную аргументами. Дождитесь завершения команды, затем верните экземпляр CompletedProcess
Есть даже раздел о том, как заменить os.system
с новым подпроцессом здесь:
sts = os.system("mycmd" + " myarg")
# becomes
sts = call("mycmd" + " myarg", shell=True)
Я предлагаю вам прочитать больше о новом модуле в официальной документации Python для подпроцесса здесь: https://docs.python.org/3.6/library/subprocess.html
Используйте API SpeedTest-Cli, как описано в вики
(следующий код из вики)
import speedtest
servers = []
# If you want to test against a specific server
# servers = [1234]
s = speedtest.Speedtest()
s.get_servers(servers)
s.get_best_server()
s.download()
s.upload()
s.results.share()
results_dict = s.results.dict()
для пинга в Python, см. этот вопрос и много ответов