Bạn cũng có thể gọi họ qua subprocess
mô-đun, nhưng ...
Đối với Python 2.7 trở lên, chỉ cần sử dụng
subprocess.check_call(['open', filename])
Trong Python 3.5+, bạn có thể sử dụng tương đối phức tạp hơn một chút nhưng cũng linh hoạt hơn
subprocess.run(['open', filename], check=True)
Nếu bạn cần tương thích hoàn toàn với Python 2.4, bạn có thể sử dụng subprocess.call()
và thực hiện kiểm tra lỗi của riêng mình:
try:
retcode = subprocess.call("open " + filename, shell=True)
if retcode < 0:
print >>sys.stderr, "Child was terminated by signal", -retcode
else:
print >>sys.stderr, "Child returned", retcode
except OSError, e:
print >>sys.stderr, "Execution failed:", e
Bây giờ, những lợi thế của việc sử dụng là subprocess
gì?
- Bảo mật: Về lý thuyết, điều này an toàn hơn, nhưng trên thực tế chúng ta cần thực thi một dòng lệnh theo cách này hay cách khác; trong cả hai môi trường, chúng ta cần môi trường và dịch vụ để giải thích, nhận đường dẫn, v.v. Trong cả hai trường hợp, chúng tôi không thực thi văn bản tùy ý, vì vậy nó không có
'filename ; rm -rf /'
vấn đề "nhưng bạn có thể gõ " cố hữu và nếu tên tệp có thể bị hỏng, sử dụng subprocess.call
sẽ cung cấp cho chúng tôi ít sự bảo vệ hơn.
- Xử lý lỗi: Nó thực sự không cung cấp cho chúng tôi bất kỳ phát hiện lỗi nào nữa, chúng tôi vẫn phụ thuộc vào một
retcode
trong hai trường hợp; nhưng hành vi đưa ra một ngoại lệ rõ ràng trong trường hợp có lỗi chắc chắn sẽ giúp bạn nhận thấy nếu có lỗi (mặc dù trong một số trường hợp, việc truy nguyên có thể không hữu ích hơn là chỉ đơn giản là bỏ qua lỗi).
- Sinh ra một quy trình con (không chặn) : Chúng ta không cần chờ quá trình con, vì chúng ta bằng cách phát biểu vấn đề bắt đầu một quy trình riêng.
Để phản đối "Nhưng subprocess
được ưa thích." Tuy nhiên, os.system()
không bị phản đối, và theo một nghĩa nào đó, đây là công cụ đơn giản nhất cho công việc đặc biệt này. Kết luận: sử dụng os.system()
do đó cũng là một câu trả lời đúng.
Một nhược điểm rõ rệt là start
lệnh Windows yêu cầu bạn vượt qua trong shell=True
đó phủ nhận hầu hết các lợi ích của việc sử dụng subprocess
.