Câu trả lời:
Các mô-đun quy trình con sẽ giúp bạn ra ngoài.
Ví dụ tầm thường:
>>> import subprocess
>>> subprocess.call(['./test.sh']) # Thanks @Jim Dennis for suggesting the []
0
>>>
Trường hợp test.sh
một tập lệnh shell đơn giản và 0
là giá trị trả về của nó cho lần chạy này.
chmod +x script.sh
. Lưu ý: script.sh là một trình giữ chỗ cho tập lệnh của bạn, thay thế nó cho phù hợp.
Có một số cách sử dụng os.popen()
(không dùng nữa) hoặc toàn bộ subprocess
mô-đun, nhưng cách tiếp cận này
import os
os.system(command)
là một trong những dễ nhất
subprocess
bạn có thể quản lý đường ống đầu vào / đầu ra / lỗi. Nó cũng tốt hơn khi bạn có nhiều đối số - với os.command()
bạn sẽ phải tạo toàn bộ dòng lệnh với thoát các ký tự đặc biệt, với subprocess
danh sách các đối số đơn giản. Nhưng đối với các nhiệm vụ đơn giản os.command()
có thể là vừa đủ.
The subprocess module provides more powerful facilities for spawning new processes and retrieving their results; *using that module is preferable to using this function.*
Trong trường hợp bạn muốn truyền một số tham số cho tập lệnh shell của mình, bạn có thể sử dụng phương thức shlex.split () :
import subprocess
import shlex
subprocess.call(shlex.split('./test.sh param1 param2'))
với test.sh
trong cùng một thư mục:
#!/bin/sh
echo $1
echo $2
exit 0
Đầu ra:
$ python test.py
param1
param2
import os
import sys
Giả sử test.sh là tập lệnh shell mà bạn muốn thực thi
os.system("sh test.sh")
Sử dụng mô đun quy trình con như đã đề cập ở trên.
Tôi sử dụng nó như thế này:
subprocess.call(["notepad"])
Tôi đang chạy python 3.5 và sub process.call (['./ test.sh']) không hoạt động với tôi.
Tôi cung cấp cho bạn ba giải pháp phụ thuộc vào những gì bạn muốn làm với đầu ra.
1 - kịch bản cuộc gọi. Bạn sẽ thấy đầu ra trong thiết bị đầu cuối của bạn. đầu ra là một con số.
import subprocess
output = subprocess.call(['test.sh'])
2 - thực hiện cuộc gọi và kết xuất và lỗi thành chuỗi. Bạn không thấy thực thi trong thiết bị đầu cuối của bạn trừ khi bạn in (thiết bị xuất chuẩn). Shell = Đúng như đối số trong Popen không hoạt động đối với tôi.
import subprocess
from subprocess import Popen, PIPE
session = subprocess.Popen(['test.sh'], stdout=PIPE, stderr=PIPE)
stdout, stderr = session.communicate()
if stderr:
raise Exception("Error "+str(stderr))
3 - gọi tập lệnh và kết xuất các lệnh echo của temp.txt trong temp_file
import subprocess
temp_file = open("temp.txt",'w')
subprocess.call([executable], stdout=temp_file)
with open("temp.txt",'r') as file:
output = file.read()
print(output)
Đừng quên xem quy trình con doc
Mô-đun quy trình là một mô-đun tốt để khởi chạy các quy trình con. Bạn có thể sử dụng nó để gọi các lệnh shell như sau:
subprocess.call(["ls","-l"]);
#basic syntax
#subprocess.call(args, *)
Bạn có thể xem tài liệu của nó ở đây.
Nếu bạn có tập lệnh được viết bằng một số tệp .sh hoặc một chuỗi dài, thì bạn có thể sử dụng mô-đun os.system. Nó khá đơn giản và dễ gọi:
import os
os.system("your command here")
# or
os.system('sh file.sh')
Lệnh này sẽ chạy tập lệnh một lần, để hoàn thành và chặn cho đến khi thoát.
Trong trường hợp tập lệnh có nhiều đối số
#!/usr/bin/python
import subprocess
output = subprocess.call(["./test.sh","xyz","1234"])
print output
Đầu ra sẽ cho mã trạng thái. Nếu tập lệnh chạy thành công, nó sẽ cho 0 nếu không là số nguyên khác không.
podname=xyz serial=1234
0
Dưới đây là kịch bản shell test.sh.
#!/bin/bash
podname=$1
serial=$2
echo "podname=$podname serial=$serial"
Quá trình con là tốt nhưng một số người có thể thích scriptine hơn. Scriptine có tập hợp các phương thức mức cao hơn như shell.call (args) , path.rename (new_name) và path.move (src, dst) . Scriptine dựa trên quy trình con và những thứ khác.
Hai nhược điểm của scriptine:
Tôi biết đây là một câu hỏi cũ nhưng tôi stumbled khi này thời gian gần đây và nó đã kết thúc misguiding tôi kể từ khi trình con API như thay đổi kể từ python 3.5.
Cách mới để thực thi các tập lệnh bên ngoài là với run
hàm, chạy lệnh được mô tả bởi args. Chờ lệnh hoàn thành, sau đó trả về một thể hiện CompleteedProcess.
import subprocess
subprocess.run(['./test.sh'])