Quá trình con python chạy không trở lại

Nói một cách đơn giản, mọi thứ xảy ra trong máy tính là một quá trình. Khi bạn mở một ứng dụng hoặc chạy các lệnh dòng lệnh hoặc tập lệnh Python, bạn đang bắt đầu một quy trình mới. Từ việc mở một thanh menu đến khởi động một ứng dụng phức tạp, mọi thứ đều là một quá trình đang chạy trên máy của bạn

Ví dụ: khi bạn gọi một tập lệnh Python từ dòng lệnh, một quy trình đang tạo một quy trình khác. Hai quá trình này hiện có mối quan hệ với nhau. quá trình tạo ra một quá trình khác là cha mẹ, trong khi quá trình được tạo ra là con

Theo nghĩa tương tự, một tập lệnh Python cũng có thể bắt đầu một quy trình mới và sau đó nó sẽ trở thành cha của quy trình mới đó. Trong bài viết này, chúng ta sẽ xem cách sử dụng mô-đun

import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
0 trong python để chạy các quy trình con khác nhau trong quá trình xử lý tập lệnh python thông thường

Mặc dù đây không phải là một bài viết nâng cao, kiến ​​thức cơ bản về Python có thể cần thiết để làm theo các ví dụ và khái niệm

Mô-đun import sys result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])0

import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
0 là một mô-đun Python tiêu chuẩn được thiết kế để bắt đầu các quy trình mới từ bên trong tập lệnh Python. Nó rất hữu ích và trên thực tế, nó là tùy chọn được đề xuất khi bạn cần chạy song song nhiều quy trình hoặc gọi một chương trình bên ngoài hoặc lệnh bên ngoài từ bên trong mã Python của bạn

Một trong những ưu điểm của mô-đun

import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
0 là nó cho phép người dùng quản lý đầu vào, đầu ra và thậm chí cả các lỗi do tiến trình con gây ra từ mã Python. Khả năng này làm cho việc gọi các quy trình con trở nên mạnh mẽ và linh hoạt hơn — chẳng hạn, nó cho phép sử dụng đầu ra của quy trình con như một biến trong phần còn lại của tập lệnh Python

Mô-đun lần đầu tiên được triển khai trong Python 2. 4 với mục tiêu trở thành một giải pháp thay thế cho các chức năng khác, chẳng hạn như

import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
4. Ngoài ra, kể từ Python 3. 5, cách sử dụng được khuyến nghị cho mô-đun này là thông qua hàm
import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
5, đây sẽ là trọng tâm của bài viết này

Sử dụng quy trình con. chạy()

Hàm

import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
6 của mô-đun
import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
0 trong Python là một cách tuyệt vời để chạy các lệnh trong nền mà không phải lo lắng về việc mở một thiết bị đầu cuối mới hoặc chạy lệnh theo cách thủ công. Chức năng này cũng tuyệt vời để tự động hóa các tác vụ hoặc chạy các lệnh mà bạn không muốn chạy thủ công

Đối số chính mà hàm nhận được là

import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
8, là một đối số có thể lặp lại chứa các hướng dẫn để chạy quy trình con. Để thực thi mã Python khác,
import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
9 phải chứa đường dẫn đến tệp thực thi Python và tập lệnh Python

Vì vậy, nó sẽ trông như thế này

import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
0

Cũng có thể viết mã Python trực tiếp vào hàm thay vì chuyển tệp 

import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
10. Đây là một ví dụ về việc chạy một quy trình con như vậy

import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
2

Bên trong

import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
9, chúng tôi có những điều sau đây

  • import sys
    
    result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
    12. đường dẫn đến tệp thực thi Python cục bộ
  • import sys
    
    result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
    13. thẻ Python cho phép người dùng viết mã Python dưới dạng văn bản vào dòng lệnh
  • import sys
    
    result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
    14. mã thực tế sẽ được chạy

Trên thực tế, điều này giống như việc chuyển

import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
15 vào dòng lệnh. Hầu hết mã trong bài viết này sẽ ở định dạng này vì nó dễ hiển thị các tính năng của hàm
import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
6 hơn. Tuy nhiên, bạn luôn có thể gọi một tập lệnh Python khác có cùng mã

Ngoài ra, cả hai lần chúng ta sử dụng hàm

import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
6 trong các ví dụ trên, chuỗi đầu tiên trong
import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
9 đề cập đến đường dẫn đến tệp thực thi Python. Ví dụ đầu tiên sử dụng một đường dẫn chung chung hơn và chúng tôi sẽ giữ nó như thế này trong suốt bài viết

Tuy nhiên, nếu bạn gặp khó khăn khi tìm đường dẫn đến tệp thực thi Python trên máy của mình, bạn có thể nhờ mô-đun

import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
19 làm điều đó giúp bạn. Mô-đun này tương tác rất tốt với
import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
0 và trường hợp sử dụng tốt cho mô-đun này là thay thế đường dẫn đến tệp thực thi như thế này

import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])

Hàm run sau đó trả về một đối tượng của lớp

import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
41, đại diện cho một quá trình đã hoàn thành

Nếu chúng tôi in

import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
42, chúng tôi sẽ có kết quả này

import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
1

Như chúng ta mong đợi, đó là một thể hiện của lớp

import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
41 hiển thị lệnh và
import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
44 cho biết rằng nó đã được chạy thành công

Thêm thông số

Bây giờ chúng ta đã hiểu cách chạy một quy trình con bằng cách sử dụng hàm

import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
6, chúng ta nên khám phá các tùy chọn cho phép chúng ta sử dụng hàm này tốt hơn

Kiểm soát Đầu ra

Lưu ý rằng đối tượng được trả về bởi đoạn mã trên chỉ hiển thị lệnh và mã trả về, ngoài ra không có thông tin nào khác về quy trình con. Tuy nhiên, nếu chúng ta đặt tham số

import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
46 thành
import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
47, nó sẽ trả về nhiều thông tin hơn giúp người dùng kiểm soát nhiều hơn đối với mã của họ

Vì vậy, nếu chúng ta chạy cái này. .

import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
4

Chúng tôi sẽ nhận được điều này. .

import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
3

Bây giờ chúng ta cũng có

import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
48 và
import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
49 trong đối tượng được trả về. Nếu chúng tôi in cả hai, chúng tôi nhận được như sau

import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
6
import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
7

Cả hai đều là chuỗi byte đại diện cho đầu ra của quy trình con. Tuy nhiên, chúng ta cũng có thể đặt tham số văn bản thành

import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
47 và sau đó có các đầu ra này dưới dạng chuỗi

Tuy nhiên, nếu có lỗi trong tập lệnh của bạn, thì

import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
48 sẽ trống và
import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
49 sẽ chứa thông báo lỗi, như thế này

import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
1
import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
2

Vì vậy, điều này có thể tạo điều kiện cho phần còn lại của mã của bạn dựa trên đầu ra của các quy trình con, để sử dụng đầu ra này như một biến xuyên suốt mã hoặc thậm chí chỉ cần theo dõi các quy trình con và lưu trữ chúng (nếu tất cả chúng chạy không có lỗi) và

Tăng lỗi

Mặc dù chúng tôi có thể tạo thông báo lỗi trong đoạn mã trên, nhưng điều quan trọng cần lưu ý là nó không dừng tiến trình cha, điều đó có nghĩa là mã sẽ vẫn chạy ngay cả khi có lỗi xảy ra trong tiến trình con

Nếu chúng tôi muốn mã tiếp tục nếu có lỗi trong quy trình con, chúng tôi có thể sử dụng tham số

import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
33 của hàm
import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
6. Bằng cách đặt tham số này thành
import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
47, bất kỳ lỗi nào trong quy trình con sẽ được đưa ra trong quy trình gốc và khiến toàn bộ mã dừng lại

Dưới đây, chúng tôi sử dụng ví dụ tương tự như trong phần trước nhưng với

import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
36

import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
20
import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
21

Mã đưa ra lỗi cho biết quy trình con đã trả về trạng thái 1

Một cách khác để báo lỗi là sử dụng tham số

import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
37. Theo tên của nó, việc sử dụng tham số này sẽ dừng tiến trình con và phát sinh lỗi nếu mất nhiều thời gian hơn dự kiến ​​để chạy

Chẳng hạn, mã trong quy trình con bên dưới mất năm giây để chạy

import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
22

Nhưng nếu chúng ta đặt tham số

import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
37 nhỏ hơn năm, chúng ta sẽ có một ngoại lệ

import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
23
import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
24

Nhập vào quy trình con

Trước đó chúng ta đã thấy rằng có thể sử dụng đầu ra của một tiến trình con trong suốt phần còn lại của mã gốc, nhưng điều ngược lại cũng đúng. chúng ta có thể nhập một giá trị từ tiến trình cha cho tiến trình con bằng cách sử dụng tham số

import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
39

Chúng tôi sử dụng tham số này để gửi bất kỳ chuỗi byte hoặc chuỗi nào (nếu là

import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
60) đến quy trình con, quy trình này sẽ nhận thông tin này thông qua mô-đun
import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
19. Hàm
import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
62 sẽ đọc tham số
import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
39 trong tiến trình con, trong đó nó có thể được gán cho một biến và được sử dụng như bất kỳ biến nào khác trong mã

Đây là một ví dụ

import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
25
import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
26

Mã trong quy trình con ở trên nhập mô-đun và sử dụng

import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
62 để gán đầu vào cho một biến, sau đó in biến đó

Tuy nhiên, chúng tôi cũng có thể nhập các giá trị thông qua

import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
9 và sử dụng
import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
66 để đọc chúng bên trong mã con. Chẳng hạn, giả sử chúng ta có đoạn mã sau trong tập lệnh có tên là
import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
67

import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
27

import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
9 trong hàm
import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
6 bên dưới nằm trong tập lệnh sẽ trở thành quy trình mẹ cho quy trình con ở trên và nó chứa hai giá trị khác sẽ được truy cập bởi
import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
66 và sau đó được cộng vào trong
import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
67

import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
28
import sys

result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
29

Sự kết luận

Mô-đun quy trình con Python và quy trình con. hàm run() là công cụ rất mạnh để tương tác với các quy trình khác trong khi chạy tập lệnh Python

Trong bài viết này, chúng tôi đã đề cập đến những điều sau đây

  • Quy trình và quy trình con

  • Cách chạy một quy trình con bằng hàm

    import sys
    
    result = subprocess.run([sys.executable, "-c", "print('This is a subprocess')"])
    5

  • Cách truy cập các kết quả đầu ra và các lỗi do quy trình con tạo ra

  • Cách phát sinh lỗi trong quy trình cha nếu có lỗi ở quy trình con

  • Cách đặt thời gian chờ cho tiến trình con

  • Cách gửi đầu vào cho tiến trình con

Data SciencepythonHướng dẫn

Quá trình con python chạy không trở lại

Thông tin về các Tác giả

Otávio Simões Silveira

Otávio là một nhà kinh tế và nhà khoa học dữ liệu đến từ Brazil. Khi rảnh rỗi, anh ấy viết về Python và Khoa học dữ liệu trên internet. Bạn có thể tìm thấy anh ấy tại LinkedIn

Quy trình con chạy có bị chặn không?

Hầu hết tương tác của bạn với mô-đun quy trình con Python sẽ thông qua hàm run(). Chức năng chặn này sẽ bắt đầu một quy trình và đợi cho đến khi quy trình mới thoát ra trước khi tiếp tục .

Quy trình con Python Popen trả về cái gì?

Hàm Popen . Ngay sau khi bắt đầu, hàm Popen trả về dữ liệu và nó không đợi quá trình con kết thúc. a pointer to a stream that may be used to read from or write to the pipe while also creating a pipe between the calling application and the executed command. Immediately after starting, the Popen function returns data, and it does not wait for the subprocess to finish.

Quá trình con có chạy chờ hoàn thành không?

quy trình con. run() là đồng bộ, nghĩa là hệ thống sẽ đợi cho đến khi chạy xong mới chuyển sang lệnh tiếp theo . quy trình con. Popen() làm điều tương tự nhưng nó không đồng bộ (hệ thống sẽ không đợi nó kết thúc).

Sự khác biệt giữa cuộc gọi quy trình con và chạy là gì?

Tôi có thể nói rằng bạn sử dụng quy trình con. call() khi bạn muốn chương trình chờ quá trình hoàn tất trước khi chuyển sang quá trình tiếp theo. Trong trường hợp quy trình con. run() , chương trình sẽ cố gắng chạy tất cả các quy trình cùng một lúc, chắc chắn sẽ khiến chương trình bị sập