Python Script thực thi các lệnh trong Terminal


109

Tôi đã đọc ở đâu đó một thời gian trước đây nhưng dường như không thể tìm thấy nó. Tôi đang cố gắng tìm một lệnh sẽ thực hiện các lệnh trong thiết bị đầu cuối và sau đó xuất ra kết quả.

Ví dụ: script sẽ là:

command 'ls -l'

Nó sẽ ra kết quả của việc chạy lệnh đó trong thiết bị đầu cuối

Câu trả lời:


198

Có nhiều hướng khác nhau để làm điều đó:

Một cách đơn giản là sử dụng mô-đun hệ điều hành:

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

Những thứ phức tạp hơn có thể đạt được với mô-đun quy trình con: ví dụ:

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

43
Tôi không muốn từ chối bạn nhưng. Bạn nên sử dụng quy trình con cho mọi thứ. Đó là cách an toàn hơn. subprocess.call () sẽ giúp bạn có một giao diện đẹp để thay thế cho biểu mẫu cuộc gọi đơn giản.
Jorge Vargas

Cảm ơn người bạn đời đã trả lời. Sẽ sử dụng python cho ứng dụng đầu tiên của tôi trên máy tính để bàn Ubuntu, điều này thực sự sẽ giúp ích cho tôi.
LinuxBill

1
Làm thế nào tôi có thể nhận được phản hồi đầy đủ của một lệnh, os.system("nslookup gmail.com")chỉ trả về dòng cuối cùng 0, nhưng tôi muốn nhận được phản hồi đầy đủ.
Parthapratim Neog

3
@JorgeVargas Bạn có thể giúp tôi hiểu tại sao nên sử dụng quy trình con cho mọi thứ không? Tại sao nó an toàn hơn?
Soutzikevich

38

Tôi thích sử dụng mô-đun quy trình con hơn:

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

Lý do là nếu bạn muốn chuyển một số biến trong tập lệnh, điều này mang lại một cách rất dễ dàng, chẳng hạn như lấy phần sau của mã

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

Làm việc tốt cho tôi khi mở ra một bức ảnh với các thông số bổ sungcall(["eog", "1breeproposal.png", "-f"])
Josh


4

Bạn cũng nên xem xét các lệnh.getstatusoutput

Điều này trả về một bộ giá trị có độ dài 2 .. Đầu tiên là số nguyên trả về (0 - khi các lệnh thành công) thứ hai là toàn bộ kết quả đầu ra như sẽ được hiển thị trong thiết bị đầu cuối.

Đối với 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'")

Điều này sẽ hoạt động. Tôi không biết làm thế nào để in đầu ra vào Python Shell.



1

Jupyter

Trong sổ tay jupyter, bạn có thể sử dụng chức năng ma thuật !

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

ipython

Để thực thi điều này như một .pytập lệnh, bạn sẽ cần sử dụngipython

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

thực thi kịch bản

$ ipython my_script.py

0

Bạn có thể nhập mô-đun 'os' và sử dụng nó như sau:

import os
os.system('#DesiredAction')

0

đối với quy trình con sử dụng python3

import subprocess
s = subprocess.getstatusoutput(f'ps -ef | grep python3')
print(s)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.