Python Script виконує команди в терміналі


109

Я читав це десь недавно, але не можу, здається, знайти його. Я намагаюся знайти команду, яка буде виконувати команди в терміналі, а потім виводити результат.

Наприклад: сценарій буде:

command 'ls -l'

Він виведе результат запуску цієї команди в терміналі

Відповіді:


198

Існує кілька способів зробити це:

Простий спосіб - використання модуля os:

import os
os.system("ls -l")

Більш складні речі можна досягти за допомогою модуля підпроцесу: наприклад:

import subprocess
test = subprocess.Popen(["ping","-W","2","-c", "1", "192.168.1.70"], stdout=subprocess.PIPE)
output = test.communicate()[0]

43
Я не хочу вас порушувати. Вам слід використовувати підпроцес для всього. Це безпечніше. subprocess.call () отримає приємний інтерфейс для заміни простої форми виклику.
Хорхе Варгас

Дякую за відповідь, товариш. Буде використовувати python для мого першого застосування на робочому столі Ubuntu, це дійсно допоможе мені.
LinuxBill

1
Як я можу отримати повну відповідь команди, os.system("nslookup gmail.com")повертає лише останній рядок 0, але я хочу отримати повну відповідь.
Партхапратім Неог

3
@JorgeVargas Чи можете ви допомогти мені зрозуміти, чому підпроцес потрібно використовувати для всього? Чому це безпечніше?
Сауцікевич

38

Я віддаю перевагу використанню модуля підпроцесу:

from subprocess import call
call(["ls", "-l"])

Причина полягає в тому, що якщо ви хочете передати якусь змінну в сценарії, це дає дуже простий спосіб, наприклад, взяти наступну частину коду

abc = a.c
call(["vim", abc])

Мені добре підійшло відкриття картини з додатковими параметрамиcall(["eog", "1breeproposal.png", "-f"])
Josh


4

Ви також повинні заглянути в команду.getstatusoutput

Це повертає кортеж довжиною 2 .. Перше - це ціле число повернення (0 - коли команди успішно виконані), друге - це весь вихід, як буде показано в терміналі.

Для лс

    import commands
    s=commands.getstatusoutput('ls')
    print s
    >> (0, 'file_1\nfile_2\nfile_3')
    s[1].split("\n")
    >> ['file_1', 'file_2', 'file_3']

2
import os
os.system("echo 'hello world'")

Це має спрацювати. Я не знаю, як надрукувати вихід в оболонку пітона.



1

Юпітер

У зошиті з юпітером можна використовувати магічну функцію !

!echo "execute a command"
files = !ls -a /data/dir/ #get the output into a variable

іпітон

Для виконання цього .pyсценарію вам потрібно буде скористатисяipython

files = get_ipython().getoutput('ls -a /data/dir/')

виконати сценарій

$ ipython my_script.py


0

для python3 використовуйте підпроцес

import subprocess
s = subprocess.getstatusoutput(f'ps -ef | grep python3')
print(s)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.