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']

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

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



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

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

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