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 Show
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 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ườngMặ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 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ạnMột trong những ưu điểm của mô-đun 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 PythonMô-đ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ư 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 5, đây sẽ là trọng tâm của bài viết nàySử dụng quy trình con. chạy()Hàm 6 của mô-đun 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à 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, 9 phải chứa đường dẫn đến tệp thực thi Python và tập lệnh PythonVì vậy, nó sẽ trông như thế này 0Cũng có thể viết mã Python trực tiếp vào hàm thay vì chuyển tệp 10. Đây là một ví dụ về việc chạy một quy trình con như vậy 2Bên trong 9, chúng tôi có những điều sau đây
Trên thực tế, điều này giống như việc chuyển 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 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 6 trong các ví dụ trên, chuỗi đầu tiên trong 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ếtTuy 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 19 làm điều đó giúp bạn. Mô-đun này tương tác rất tốt với 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
Hàm run sau đó trả về một đối tượng của lớp 41, đại diện cho một quá trình đã hoàn thànhNếu chúng tôi in 42, chúng tôi sẽ có kết quả này 1Như chúng ta mong đợi, đó là một thể hiện của lớp 41 hiển thị lệnh và 44 cho biết rằng nó đã được chạy thành côngThê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 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ơnKiểm soát Đầu raLư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ố 46 thành 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. . 4Chúng tôi sẽ nhận được điều này. . 3Bây giờ chúng ta cũng có 48 và 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 6 7Cả 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 47 và sau đó có các đầu ra này dưới dạng chuỗiTuy nhiên, nếu có lỗi trong tập lệnh của bạn, thì 48 sẽ trống và 49 sẽ chứa thông báo lỗi, như thế này 1 2Vì 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ỗiMặ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ố 33 của hàm 6. Bằng cách đặt tham số này thành 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ạiDưới đây, chúng tôi sử dụng ví dụ tương tự như trong phần trước nhưng với 36 20 21Mã đư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ố 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ạyChẳng hạn, mã trong quy trình con bên dưới mất năm giây để chạy 22Nhưng nếu chúng ta đặt tham số 37 nhỏ hơn năm, chúng ta sẽ có một ngoại lệ 23 24Nhập vào quy trình conTrướ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ố 39Chú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à 60) đến quy trình con, quy trình này sẽ nhận thông tin này thông qua mô-đun 19. Hàm 62 sẽ đọc tham số 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ụ 25 26Mã trong quy trình con ở trên nhập mô-đun và sử dụng 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 9 và sử dụng 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à 67 27 9 trong hàm 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 66 và sau đó được cộng vào trong 67 28 29Sự kết luậnMô-đ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
Data SciencepythonHướng dẫn Thông tin về các Tác giả Otávio Simões SilveiraOtá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 |