#python-3.x
#python-3.x
Вопрос:
нужна помощь в этом скрипте, где я пытаюсь получить выходные данные, связанные с этой командой. Например, в приведенном ниже коде «информация, относящаяся к процессу, и выходные данные должны быть выводом команды ps -ef и должны аналогично переходить к следующей команде и оператору печати», но я получаю строки, говорящие
информация, относящаяся к процессу, и все команды отображаются одновременно.
#!/usr/bin/env python3.7
import os
state = ['process' , 'http status' , 'date info' , 'system']
def comm(com):
for i in state:
for j in com:
print (f"info related to {i}")
os.system(j)
cmd = ['ps -ef | head -2' , 'systemctl status httpd' , 'date' , 'uptime']
comm(cmd)
ВЫВОД:
info related to process
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 10:13 ? 00:00:19 /usr/lib/systemd/systemd -
-switched-root --system --deserialize 22
info related to process
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor
preset: disabled)
Active: active (running) since Wed 2019-03-27 18:27:50 IST; 1 day 2h ago
Docs: man:httpd(8)
man:apachectl(8)
Process: 8585 ExecReload=/usr/sbin/httpd $OPTIONS -k graceful (code=exited,
status=0/SUCCESS)
Main PID: 1367 (httpd)
Status: "Total requests: 0; Current requests/sec: 0; Current traffic: 0
B/sec"
Tasks: 6
CGroup: /system.slice/httpd.service
├─1367 /usr/sbin/httpd -DFOREGROUND
├─8597 /usr/sbin/httpd -DFOREGROUND
├─8598 /usr/sbin/httpd -DFOREGROUND
├─8599 /usr/sbin/httpd -DFOREGROUND
├─8600 /usr/sbin/httpd -DFOREGROUND
└─8601 /usr/sbin/httpd -DFOREGROUND
info related to process
Thu Mar 28 21:03:57 IST 2019
info related to process
21:03:57 up 10:50, 4 users, load average: 0.35, 0.09, 0.14
Комментарии:
1. При запуске вашего кода все кажется нормальным. Можете ли вы скопировать свои выходные данные ? Также какую консоль вы используете ?
2. Пожалуйста, найдите результат:
3. Ответ лежит в @Etienne. Внимательно посмотрите на свой код. Если у вас возникли какие-либо другие проблемы, попробуйте запустить
for i in range() : for j in range() : print(i,j)
Ответ №1:
У вас есть два цикла, один из которых вложен в другой. Это означает, что все, что делает внутренний цикл, будет выполняться на каждой итерации внешнего цикла. Именно так работают циклы, но не то, что (я полагаю) вы хотите здесь сделать.
У вас есть команды, которые должны выполняться os
модулем, и несколько имен состояний, которые с ними связаны. С точки зрения данных, мы могли бы структурировать их в словаре:
commands = {
'process': 'ps -ef',
'http status': 'systemctl status httpd',
'date info': 'date',
'sytem': 'uptime',
}
Теперь, когда мы выполняем итерацию по этому словарю, на каждой итерации у нас будут как имя состояния, так и команда, которая будет выполняться как переменные цикла. Циклы становятся одним for
циклом, и в итоге мы получаем:
def comm(commands):
for name, command in commands.items():
print (f"info related to {name}")
os.system(command)