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.