Python Script menjalankan perintah di Terminal

109

Saya membaca ini di suatu tempat beberapa waktu yang lalu tetapi sepertinya tidak dapat menemukannya. Saya mencoba menemukan perintah yang akan menjalankan perintah di terminal dan kemudian menampilkan hasilnya.

Contoh: scriptnya adalah:

command 'ls -l'

Ini akan keluar hasil dari menjalankan perintah itu di terminal

Ali
sumber

Jawaban:

198

Ada beberapa cara untuk melakukannya:

Cara sederhana menggunakan modul os:

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

Hal-hal yang lebih kompleks dapat dicapai dengan modul subprocess: misalnya:

import subprocess
test = subprocess.Popen(["ping","-W","2","-c", "1", "192.168.1.70"], stdout=subprocess.PIPE)
output = test.communicate()[0]
Uku Loskit
sumber
43
Saya tidak ingin meremehkan Anda, tetapi. Anda harus menggunakan subproses untuk semuanya. Ini jauh lebih aman. subprocess.call () akan memberi Anda antarmuka yang bagus untuk menggantikan formulir panggilan sederhana.
Jorge Vargas
Terima kasih atas jawaban itu sobat. Akan menggunakan python untuk aplikasi pertama saya di desktop Ubuntu, ini akan sangat membantu saya.
LinuxBill
1
Bagaimana saya bisa mendapatkan respons lengkap dari sebuah perintah, os.system("nslookup gmail.com")hanya mengembalikan baris terakhir 0, tetapi saya ingin mendapatkan respons penuh.
Parthapratim Neog
3
@JorgeVargas Dapatkah Anda membantu saya memahami mengapa subproses harus digunakan untuk semuanya? Mengapa lebih aman?
Soutzikevich
38

Saya lebih suka menggunakan modul subproses:

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

Alasannya adalah jika Anda ingin melewatkan beberapa variabel dalam skrip ini memberikan cara yang sangat mudah misalnya mengambil bagian kode berikut

abc = a.c
call(["vim", abc])
Kevin Pandya
sumber
Bekerja dengan baik untuk saya membuka gambar dengan parameter ekstracall(["eog", "1breeproposal.png", "-f"])
Josh
4

Anda juga harus melihat ke commands.getstatusoutput

Ini mengembalikan tupel dengan panjang 2 .. Yang pertama adalah bilangan bulat kembali (0 - ketika perintah berhasil) kedua adalah seluruh output seperti yang akan ditampilkan di terminal.

Untuk 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
sumber
2
import os
os.system("echo 'hello world'")

Ini seharusnya berhasil. Saya tidak tahu cara mencetak output ke shell python.

Mr_pzling_Pie
sumber
1

The os.popen () cukup hanya untuk digunakan, tetapi telah ditinggalkan sejak Python 2.6. Anda harus menggunakan modul subprocess sebagai gantinya.

Baca di sini: membaca os.popen (perintah) menjadi string

Paolo Rovelli
sumber
1

Jupyter

Di notebook jupyter Anda dapat menggunakan fungsi ajaib !

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

ipython

Untuk menjalankan ini sebagai .pyskrip, Anda perlu menggunakanipython

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

jalankan skrip

$ ipython my_script.py
Zephro
sumber
0

Anda dapat mengimpor modul 'os' dan menggunakannya seperti ini:

import os
os.system('#DesiredAction')
Kobe Keirouz
sumber
0

untuk menggunakan subproses python3

import subprocess
s = subprocess.getstatusoutput(f'ps -ef | grep python3')
print(s)
Avi Avidan
sumber