Python Script выполняет команды в Терминале

110

Я читал это где-то некоторое время назад, но, похоже, не могу его найти. Я пытаюсь найти команду, которая будет выполнять команды в терминале, а затем выводить результат.

Например: сценарий будет:

command 'ls -l'

Это выдаст результат выполнения этой команды в терминале

Али
источник

Ответы:

200

Есть несколько способов сделать это:

Простой способ - использовать модуль 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]
Уку Лоскит
источник
44
Я не хочу отрицать тебя, но. Вы должны использовать подпроцесс для всего. Так безопаснее. subprocess.call () предоставит вам приятный интерфейс, чтобы заменить простую форму вызова.
Хорхе Варгас,
Спасибо за этот ответ, дружище. Я буду использовать python для своего первого приложения на рабочем столе Ubuntu, это мне действительно поможет.
LinuxBill
1
Как я могу получить полный ответ на команду, os.system("nslookup gmail.com")возвращает только последнюю строку 0, но я хочу получить полный ответ.
Parthapratim Neog
3
@JorgeVargas Можете ли вы помочь мне понять, почему подпроцесс должен использоваться для всего? Почему это безопаснее?
Soutzikevich
39

Я предпочитаю использовать модуль подпроцесса:

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

Причина в том, что если вы хотите передать некоторую переменную в скрипт, это дает очень простой способ, например, взять следующую часть кода

abc = a.c
call(["vim", abc])
Кевин Пандья
источник
Хорошо сработало, открывая картинку с дополнительными параметрамиcall(["eog", "1breeproposal.png", "-f"])
Джош
4

Вам также следует изучить commands.getstatusoutput

Это возвращает кортеж длиной 2 .. Первое - это возвращаемое целое число (0 - когда команды успешны), второе - это весь вывод, как будет показано в терминале.

Для ls

    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']
Minocha
источник
2
import os
os.system("echo 'hello world'")

Это должно работать. Я не знаю, как распечатать вывод в оболочке python.

Mr_pzling_Pie
источник
1

Os.popen () довольно просто использовать, но он устарел , так как Python 2.6. Вместо этого вы должны использовать модуль подпроцесса .

Читайте здесь: чтение os.popen (команды) в строку

Паоло Ровелли
источник
1

Юпитер

В блокноте jupyter вы можете использовать волшебную функцию !

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

ipython

Чтобы выполнить это как .pyсценарий, вам нужно будет использоватьipython

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

выполнить сценарий

$ ipython my_script.py
Зефро
источник
0

Вы можете импортировать модуль 'os' и использовать его так:

import os
os.system('#DesiredAction')
Коби Кейруз
источник
0

для python3 используйте подпроцесс

import subprocess
s = subprocess.getstatusoutput(f'ps -ef | grep python3')
print(s)
Ави Авидан
источник