Невозможно напечатать строки в цикле условно

#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)