Python chạy lệnh shell trong nền và nhận đầu ra

Bởi vì tất cả các chức năng quy trình con của asyncio đều không đồng bộ và asyncio cung cấp nhiều công cụ để làm việc với các chức năng đó, nên rất dễ thực hiện và giám sát nhiều quy trình con song song. Việc sửa đổi ví dụ trên để chạy một số lệnh đồng thời là chuyện nhỏ

async def main[]:
    await asyncio.gather[
        run['ls /zzz'],
        run['sleep 1; echo "hello"']]

asyncio.run[main[]]

Xem thêm phần Ví dụ

Tạo quy trình con¶

coroutine asyncio. create_sub process_exec[chương trình , *args, stdin=None, stdout=None, stderr=None, limit=None, **kwds]

Tạo một quy trình con

Đối số giới hạn đặt giới hạn bộ đệm cho các trình bao bọc

['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
7 cho
['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
8 và
['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
9 [nếu
['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
0 được truyền cho các đối số thiết bị xuất chuẩn và thiết bị xuất chuẩn]

Trả về một phiên bản

['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
1

Xem tài liệu của

['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
2 để biết các tham số khác

Đã thay đổi trong phiên bản 3. 10. Đã xóa tham số vòng lặp.

coroutine asyncio. create_sub process_shell[cmd , stdin=None, stdout=None, stderr=None, limit=None, **kwds]

Chạy lệnh shell cmd

Đối số giới hạn đặt giới hạn bộ đệm cho các trình bao bọc

['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
7 cho
['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
8 và
['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
9 [nếu
['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
0 được truyền cho các đối số thiết bị xuất chuẩn và thiết bị xuất chuẩn]

Trả về một phiên bản

['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
1

Xem tài liệu của

['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
5 để biết các thông số khác

Quan trọng

Ứng dụng có trách nhiệm đảm bảo rằng tất cả các khoảng trắng và ký tự đặc biệt được trích dẫn một cách thích hợp để tránh các lỗ hổng shell injection. Hàm

['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
6 có thể được sử dụng để thoát đúng khoảng trắng và các ký tự shell đặc biệt trong các chuỗi sẽ được sử dụng để tạo các lệnh shell

Đã thay đổi trong phiên bản 3. 10. Đã xóa tham số vòng lặp.

Ghi chú

Các quy trình con khả dụng cho Windows nếu sử dụng

['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
7. Xem Hỗ trợ quy trình con trên Windows để biết chi tiết.

Xem thêm

asyncio cũng có các API cấp thấp sau đây để hoạt động với các quy trình con.

['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
2,
['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
5,
async def main[]:
    await asyncio.gather[
        run['ls /zzz'],
        run['sleep 1; echo "hello"']]

asyncio.run[main[]]
0,
async def main[]:
    await asyncio.gather[
        run['ls /zzz'],
        run['sleep 1; echo "hello"']]

asyncio.run[main[]]
1, cũng như Vận chuyển quy trình conGiao thức quy trình con.

Hằng số¶

không đồng bộ. quy trình con. ỐNG ỐNG

Có thể được chuyển đến các tham số stdin, stdout hoặc stderr

Nếu PIPE được truyền cho đối số stdin, thuộc tính

async def main[]:
    await asyncio.gather[
        run['ls /zzz'],
        run['sleep 1; echo "hello"']]

asyncio.run[main[]]
2 sẽ trỏ đến một thể hiện
async def main[]:
    await asyncio.gather[
        run['ls /zzz'],
        run['sleep 1; echo "hello"']]

asyncio.run[main[]]
3

Nếu PIPE được truyền cho các đối số stdout hoặc stderr, các thuộc tính

['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
8 và
['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
9 sẽ trỏ đến các trường hợp
['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
7

không đồng bộ. quy trình con. STDOUT

Giá trị đặc biệt có thể được sử dụng làm đối số chuẩn và chỉ ra rằng lỗi tiêu chuẩn sẽ được chuyển hướng thành đầu ra tiêu chuẩn

không đồng bộ. quy trình con. DEVNULL

Giá trị đặc biệt có thể được sử dụng làm đối số stdin, stdout hoặc stderr để xử lý các hàm tạo. Nó chỉ ra rằng tệp đặc biệt

async def main[]:
    await asyncio.gather[
        run['ls /zzz'],
        run['sleep 1; echo "hello"']]

asyncio.run[main[]]
7 sẽ được sử dụng cho luồng quy trình con tương ứng

Tương tác với các quy trình con¶

Cả hai hàm

async def main[]:
    await asyncio.gather[
        run['ls /zzz'],
        run['sleep 1; echo "hello"']]

asyncio.run[main[]]
8 và
async def main[]:
    await asyncio.gather[
        run['ls /zzz'],
        run['sleep 1; echo "hello"']]

asyncio.run[main[]]
9 đều trả về các thể hiện của lớp Process. Quy trình là trình bao bọc cấp cao cho phép giao tiếp với các quy trình con và theo dõi quá trình hoàn thành của chúng

lớp không đồng bộ. quy trình con. Quy trình

Một đối tượng bao bọc các quy trình của hệ điều hành được tạo bởi các hàm

async def main[]:
    await asyncio.gather[
        run['ls /zzz'],
        run['sleep 1; echo "hello"']]

asyncio.run[main[]]
8 và
async def main[]:
    await asyncio.gather[
        run['ls /zzz'],
        run['sleep 1; echo "hello"']]

asyncio.run[main[]]
9

Lớp này được thiết kế để có API tương tự như lớp

['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
42, nhưng có một số điểm khác biệt đáng chú ý

  • không giống như Popen, các phiên bản Quy trình không có phương thức tương đương với phương thức

    ['ls /zzz' exited with 1]
    [stderr]
    ls: /zzz: No such file or directory
    
    43;

  • các phương thức

    ['ls /zzz' exited with 1]
    [stderr]
    ls: /zzz: No such file or directory
    
    44 và
    ['ls /zzz' exited with 1]
    [stderr]
    ls: /zzz: No such file or directory
    
    45 không có tham số thời gian chờ. sử dụng chức năng
    ['ls /zzz' exited with 1]
    [stderr]
    ls: /zzz: No such file or directory
    
    46;

  • phương thức

    ['ls /zzz' exited with 1]
    [stderr]
    ls: /zzz: No such file or directory
    
    47 không đồng bộ, trong khi phương thức
    ['ls /zzz' exited with 1]
    [stderr]
    ls: /zzz: No such file or directory
    
    48 được triển khai dưới dạng vòng lặp bận chặn;

  • tham số universal_newlines không được hỗ trợ

Lớp này không phải luồng an toàn .

Cũng xem phần Quy trình con và Chủ đề .

quy trình đợi[]

Đợi quá trình con kết thúc

Đặt và trả về thuộc tính

['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
49

Ghi chú

Phương pháp này có thể bế tắc khi sử dụng

['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
70 hoặc
['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
71 và quy trình con tạo ra nhiều đầu ra đến mức nó chặn chờ bộ đệm đường ống của hệ điều hành chấp nhận thêm dữ liệu. Sử dụng phương pháp
['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
44 khi sử dụng đường ống để tránh tình trạng này

coroutine giao tiếp[đầu vào=None]

Tương tác với quy trình

  1. gửi dữ liệu tới stdin [nếu đầu vào không phải là

    ['ls /zzz' exited with 1]
    [stderr]
    ls: /zzz: No such file or directory
    
    73];

  2. đọc dữ liệu từ thiết bị xuất chuẩn và thiết bị xuất chuẩn cho đến khi đạt được EOF;

  3. đợi quá trình kết thúc

Đối số đầu vào tùy chọn là dữ liệu [đối tượng ____274] sẽ được gửi đến tiến trình con

Trả về một tuple

['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
75

Nếu một trong hai ngoại lệ

['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
76 hoặc
['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
77 được đưa ra khi ghi đầu vào vào stdin, thì ngoại lệ đó sẽ bị bỏ qua. Tình trạng này xảy ra khi quá trình thoát trước khi tất cả dữ liệu được ghi vào stdin

Nếu muốn gửi dữ liệu đến stdin của quy trình, quy trình cần được tạo bằng

['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
78. Tương tự, để lấy bất kỳ thứ gì khác ngoài
['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
73 trong bộ dữ liệu kết quả, quy trình phải được tạo với các đối số
['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
70 và/hoặc
['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
71

Lưu ý rằng dữ liệu đọc được lưu vào bộ nhớ đệm, vì vậy không sử dụng phương pháp này nếu kích thước dữ liệu lớn hoặc không giới hạn

send_signal[signal]

Gửi tín hiệu tín hiệu cho tiến trình con

Ghi chú

Trên Windows,

['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
82 là bí danh của
['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
83.
['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
84 và
['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
85 có thể được gửi đến các quy trình bắt đầu bằng tham số creationflags bao gồm
['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
86

chấm dứt[]

Dừng tiến trình con

Trên các hệ thống POSIX, phương thức này sẽ gửi

['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
87 tới tiến trình con

Trên Windows, hàm API Win32

['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
88 được gọi để dừng tiến trình con

giết[]

Giết tiến trình con

Trên các hệ thống POSIX, phương thức này sẽ gửi

['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
89 tới quy trình con

Trên Windows, phương thức này là bí danh của

['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
83

stdin

Luồng đầu vào tiêu chuẩn [

async def main[]:
    await asyncio.gather[
        run['ls /zzz'],
        run['sleep 1; echo "hello"']]

asyncio.run[main[]]
3] hoặc
['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
73 nếu quy trình được tạo bằng
['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
93

stdout

Luồng đầu ra tiêu chuẩn [

['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
7] hoặc
['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
73 nếu quy trình được tạo bằng
['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
96

stderr

Luồng lỗi tiêu chuẩn [

['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
7] hoặc
['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
73 nếu quy trình được tạo bằng
['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
99

Cảnh báo

Sử dụng phương pháp

['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
44 thay vì
['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
01,
['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
02 hoặc
['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
03. Điều này tránh bế tắc do các luồng tạm dừng đọc hoặc ghi và chặn tiến trình con

pid

Số nhận dạng quy trình [PID]

Lưu ý rằng đối với các quy trình được tạo bởi hàm

async def main[]:
    await asyncio.gather[
        run['ls /zzz'],
        run['sleep 1; echo "hello"']]

asyncio.run[main[]]
9, thuộc tính này là PID của trình bao được sinh ra

mã trả về

Mã trả về của quá trình khi nó thoát

Giá trị

['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
73 chỉ ra rằng quá trình vẫn chưa kết thúc

Giá trị âm

['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
06 cho biết rằng trẻ đã bị chấm dứt bởi tín hiệu
['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
07 [chỉ POSIX]

Quy trình con và Chủ đề¶

Theo mặc định, vòng lặp sự kiện asyncio tiêu chuẩn hỗ trợ chạy các quy trình con từ các luồng khác nhau

Trên các quy trình con của Windows chỉ được cung cấp bởi

['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
7 [mặc định],
['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
09 không có hỗ trợ quy trình con

Trên UNIX, trình theo dõi con được sử dụng để chờ kết thúc quy trình con, hãy xem Trình theo dõi quy trình để biết thêm thông tin.

Đã thay đổi trong phiên bản 3. 8. UNIX đã chuyển sang sử dụng

['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
10 để sinh ra các quy trình con từ các luồng khác nhau mà không có bất kỳ giới hạn nào.

Sinh ra một quy trình con với trình theo dõi trẻ em hiện tại không hoạt động sẽ tăng

['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
11

Lưu ý rằng việc triển khai vòng lặp sự kiện thay thế có thể có những hạn chế riêng;

Xem thêm

Phần Đồng thời và đa luồng trong asyncio .

Ví dụ¶

Một ví dụ sử dụng lớp

['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
1 để kiểm soát một quy trình con và lớp
['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
7 để đọc từ đầu ra tiêu chuẩn của nó

Tập lệnh Python có thể chạy trong nền không?

Cách dễ nhất để chạy tập lệnh python trong nền là sử dụng tính năng cronjob [trong macOS và Linux] . Trong windows, chúng ta có thể sử dụng Windows Task Scheduler. Sau đó, bạn có thể cung cấp đường dẫn của tệp tập lệnh python của mình để chạy vào một thời điểm cụ thể bằng cách cung cấp thông tin chi tiết về thời gian.

Làm cách nào để lưu trữ đầu ra của lệnh trong biến trong Python?

Quy trình con Python. Sử dụng quy trình con. hàm check_output[] chúng ta có thể lưu trữ đầu ra trong một biến.

Chủ Đề