Создайте функцию 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, см. этот вопрос и много ответов

Другие вопросы по тегам