Ví dụ getstatusoutput lệnh Python

Tài liệu. lệnh-ví dụ-1. lệnh nhập py stat, đầu ra = lệnh. getstatusoutput["ls -lR"] in "trạng thái", "=>", in stat "đầu ra", "=>", len[đầu ra], "byte" status => 0 output => 171046 bytes

Nếu bạn đã từng muốn đơn giản hóa tập lệnh dòng lệnh của mình hoặc sử dụng Python cùng với các ứng dụng dòng lệnh—hoặc bất kỳ ứng dụng nào cho vấn đề đó—thì mô-đun Python

$ python timer.py 5
0 có thể giúp bạn. Từ việc chạy các lệnh shell và các ứng dụng dòng lệnh đến khởi chạy các ứng dụng GUI, mô-đun
$ python timer.py 5
0 của Python có thể trợ giúp

Đến cuối hướng dẫn này, bạn sẽ có thể

  • Hiểu cách mô-đun Python
    $ python timer.py 5
    
    0 tương tác với hệ điều hành
  • Đưa ra các lệnh shell như
    $ python timer.py 5
    
    3 hoặc
    $ python timer.py 5
    
    4
  • Đưa đầu vào vào một quy trình và sử dụng đầu ra của nó
  • Xử lý lỗi khi sử dụng
    $ python timer.py 5
    
    0
  • Hiểu các trường hợp sử dụng cho
    $ python timer.py 5
    
    0 bằng cách xem xét các ví dụ thực tế

Trong hướng dẫn này, bạn sẽ có kiến ​​thức để hiểu các quy trình, quy trình con và Python trước khi bị mắc kẹt vào mô-đun

$ python timer.py 5
0 và. Sau đó, bạn sẽ bắt đầu khám phá shell và tìm hiểu cách bạn có thể tận dụng
$ python timer.py 5
0 của Python với shell và hệ thống. Cụ thể, bạn sẽ bao gồm, và

Ghi chú.

$ python timer.py 5
0 không phải là mô-đun tự động hóa GUI hay cách để đạt được đồng thời. Để tự động hóa GUI, bạn có thể muốn xem PyAutoGUI. Đối với đồng thời, hãy xem phần hướng dẫn này trên

Khi bạn đã có kiến ​​thức cơ bản, bạn sẽ khám phá một số cách tận dụng

$ python timer.py 5
0 của Python. Bạn cũng sẽ nhúng ngón chân vào
$ python timer.py 5
0 của Python bằng cách thử nghiệm với hàm tạo
>>> import shlex
>>> shlex.split["python timer.py 5"]
['python', 'timer.py', '5']

>>> subprocess.run[shlex.split["python timer.py 5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
3 bên dưới

Mã nguồn. Nhấp vào đây để tải xuống mã nguồn miễn phí mà bạn sẽ sử dụng để làm quen với mô-đun Python

$ python timer.py 5
0

Quy trình và quy trình con

Trước hết, bạn có thể thắc mắc tại sao lại có một

>>> import shlex
>>> shlex.split["python timer.py 5"]
['python', 'timer.py', '5']

>>> subprocess.run[shlex.split["python timer.py 5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
5 trong tên mô-đun Python
$ python timer.py 5
0. Và chính xác thì một quá trình là gì? . Bạn sẽ có một mô hình tinh thần cấp cao để suy nghĩ về các quy trình. Nếu bạn đã quen thuộc với các quy trình, thì bạn có thể muốn bỏ qua trực tiếp đến

Loại bỏ các quảng cáo

Quy trình và hệ điều hành

Bất cứ khi nào bạn sử dụng máy tính, bạn sẽ luôn tương tác với các chương trình. Một quy trình là sự trừu tượng của hệ điều hành về một chương trình đang chạy. Vì vậy, sử dụng máy tính luôn liên quan đến các quá trình. Menu bắt đầu, thanh ứng dụng, trình thông dịch dòng lệnh, trình soạn thảo văn bản, trình duyệt, v.v.—mọi ứng dụng đều bao gồm một hoặc nhiều quy trình

Một hệ điều hành điển hình sẽ báo cáo hàng trăm hoặc thậm chí hàng nghìn quy trình đang chạy mà bạn sẽ khám phá. Tuy nhiên, các đơn vị xử lý trung tâm [CPU] thường chỉ có một số ít lõi, điều đó có nghĩa là chúng chỉ có thể chạy một số lệnh đồng thời. Vì vậy, bạn có thể tự hỏi làm thế nào mà hàng ngàn quy trình có thể chạy cùng một lúc

Tóm lại, hệ điều hành là một bộ đa nhiệm kỳ diệu—vì nó phải. CPU là bộ não của máy tính, nhưng nó hoạt động ở thang thời gian nano giây. Hầu hết các thành phần khác của máy tính đều chậm hơn nhiều so với CPU. Chẳng hạn, việc đọc đĩa cứng từ mất nhiều thời gian hơn hàng nghìn lần so với hoạt động của CPU thông thường

Nếu một quá trình cần ghi một cái gì đó vào ổ cứng hoặc đợi phản hồi từ máy chủ từ xa, thì CPU sẽ không hoạt động trong hầu hết thời gian. Đa nhiệm khiến CPU luôn bận rộn

Một phần khiến hệ điều hành trở nên tuyệt vời trong đa nhiệm là nó cũng được tổ chức tuyệt vời. Hệ điều hành theo dõi các quy trình trong bảng quy trình hoặc khối điều khiển quy trình. Trong bảng này, bạn sẽ tìm thấy ngữ cảnh bảo mật, tham chiếu đến không gian địa chỉ của quy trình, v.v.

Bảng quy trình cho phép hệ điều hành từ bỏ một quy trình cụ thể theo ý muốn, bởi vì nó có tất cả thông tin cần thiết để quay lại và tiếp tục quy trình sau đó. Một tiến trình có thể bị gián đoạn hàng nghìn lần trong khi thực thi, nhưng hệ điều hành luôn tìm thấy chính xác điểm mà nó đã dừng lại khi quay lại

Tuy nhiên, một hệ điều hành không khởi động với hàng ngàn quy trình. Nhiều quy trình mà bạn quen thuộc được bắt đầu bởi chính bạn. Trong phần tiếp theo, bạn sẽ xem xét thời gian tồn tại của một quy trình

Quy trình trọn đời

Hãy nghĩ về cách bạn có thể bắt đầu một ứng dụng Python từ dòng lệnh. Đây là một ví dụ về quy trình dòng lệnh của bạn khi bắt đầu quy trình Python

Quá trình bắt đầu một quá trình khác được gọi là cha mẹ và quá trình mới được gọi là con. Các tiến trình cha và con hầu như chạy độc lập. Đôi khi đứa trẻ kế thừa các tài nguyên hoặc bối cảnh cụ thể từ cha mẹ

Như bạn đã học trong phần , thông tin về các quy trình được lưu giữ trong một bảng. Mỗi quy trình theo dõi cha mẹ của nó, điều này cho phép hệ thống phân cấp quy trình được biểu diễn dưới dạng cây. Bạn sẽ khám phá cây quy trình của hệ thống trong

Ghi chú. Cơ chế chính xác để tạo các quy trình khác nhau tùy thuộc vào hệ điều hành. Để có cái nhìn tổng quan ngắn gọn, bài viết trên Wikipedia về quản lý quy trình có một phần ngắn về

Để biết thêm chi tiết về cơ chế Windows, hãy xem trang tài liệu API win32 về cách tạo quy trình

Trên các hệ thống dựa trên UNIX, các quy trình thường được tạo bằng cách sử dụng

>>> import shlex
>>> shlex.split["python timer.py 5"]
['python', 'timer.py', '5']

>>> subprocess.run[shlex.split["python timer.py 5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
8 để sao chép quy trình hiện tại và sau đó thay thế quy trình con bằng một trong các hàm
>>> import shlex
>>> shlex.split["python timer.py 5"]
['python', 'timer.py', '5']

>>> subprocess.run[shlex.split["python timer.py 5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
9

Mối quan hệ cha-con giữa một quy trình và quy trình con của nó không phải lúc nào cũng giống nhau. Đôi khi, hai quy trình sẽ chia sẻ các tài nguyên cụ thể, chẳng hạn như đầu vào và đầu ra, nhưng đôi khi chúng sẽ không. Đôi khi các tiến trình con tồn tại lâu hơn tiến trình cha. Một đứa trẻ sống lâu hơn cha mẹ có thể dẫn đến quá trình mồ côi hoặc thây ma, mặc dù thảo luận thêm về những điều đó nằm ngoài phạm vi của hướng dẫn này

Khi một tiến trình chạy xong, nó thường sẽ kết thúc. Mỗi quá trình, khi thoát, sẽ trả về một số nguyên. Số nguyên này được gọi là mã trả về hoặc trạng thái thoát. Số không đồng nghĩa với thành công, trong khi bất kỳ giá trị nào khác được coi là thất bại. Các số nguyên khác nhau có thể được sử dụng để chỉ ra lý do tại sao một quá trình không thành công

Cũng giống như cách bạn có thể trả về một giá trị từ một hàm trong Python, hệ điều hành mong đợi một giá trị trả về số nguyên từ một quy trình sau khi nó thoát. Đây là lý do tại sao hàm kinh điển C

>>> shlex.split["echo 'Hello, World!'"]
['echo', 'Hello, World!']
0 thường trả về một số nguyên

// minimal_program.c

int main[]{
    return 0;
}

Ví dụ này cho thấy số lượng mã C tối thiểu cần thiết để biên dịch tệp với

>>> shlex.split["echo 'Hello, World!'"]
['echo', 'Hello, World!']
1 mà không có bất kỳ cảnh báo nào. Nó có hàm
>>> shlex.split["echo 'Hello, World!'"]
['echo', 'Hello, World!']
0 trả về một số nguyên. Khi chương trình này chạy, hệ điều hành sẽ hiểu việc thực thi của nó là thành công vì nó trả về 0

Vì vậy, những quy trình nào đang chạy trên hệ thống của bạn ngay bây giờ? . Có thể xem quy trình nào đang chạy và cách chúng được cấu trúc sẽ hữu ích khi trực quan hóa cách thức hoạt động của mô-đun

$ python timer.py 5
0

Loại bỏ các quảng cáo

Các quy trình đang hoạt động trên hệ thống của bạn

Bạn có thể tò mò muốn biết những quy trình nào đang chạy trên hệ thống của mình ngay bây giờ. Để làm được điều đó, bạn có thể sử dụng các tiện ích dành riêng cho nền tảng để theo dõi chúng

Có nhiều công cụ có sẵn cho Windows, nhưng một công cụ dễ cài đặt, nhanh chóng và sẽ hiển thị cho bạn cây quy trình mà không cần nỗ lực nhiều là Process Hacker

Bạn có thể cài đặt Process Hacker bằng cách truy cập trang tải xuống hoặc bằng Chocolatey

PS> choco install processhacker

Mở ứng dụng và bạn sẽ thấy ngay cây quy trình

Một trong những lệnh gốc mà bạn có thể sử dụng với PowerShell là

>>> shlex.split["echo 'Hello, World!'"]
['echo', 'Hello, World!']
4, liệt kê các quy trình đang hoạt động trên dòng lệnh.
>>> shlex.split["echo 'Hello, World!'"]
['echo', 'Hello, World!']
5 là một tiện ích nhắc lệnh thực hiện tương tự

Phiên bản chính thức của Microsoft Process Hacker là một phần của các tiện ích Sysinternals, cụ thể là Process Monitor và Process Explorer. Bạn cũng nhận được PsList, một tiện ích dòng lệnh tương tự như

>>> shlex.split["echo 'Hello, World!'"]
['echo', 'Hello, World!']
6 trên UNIX. Bạn có thể cài đặt Sysiternals bằng cách truy cập trang tải xuống hoặc bằng cách sử dụng Chocolatey

PS> choco install sysinternals

Bạn cũng có thể sử dụng Trình quản lý tác vụ cơ bản nhưng cổ điển hơn—có thể truy cập bằng cách nhấn Win +X and selecting the Task Manager.

Đối với các hệ thống dựa trên UNIX, có nhiều tiện ích dòng lệnh để lựa chọn

  • ____18_______7. Trình theo dõi tài nguyên và quy trình cổ điển, thường được cài đặt theo mặc định. Khi nó đang chạy, để xem chế độ xem dạng cây, còn được gọi là chế độ xem rừng, hãy nhấn Shift + V. The forest view may not work on the default macOS
    >>> shlex.split["echo 'Hello, World!'"]
    ['echo', 'Hello, World!']
    
    7.
  • >>> shlex.split["echo 'Hello, World!'"]
    ['echo', 'Hello, World!']
    
    9. Phiên bản nâng cao và thân thiện hơn của
    >>> shlex.split["echo 'Hello, World!'"]
    ['echo', 'Hello, World!']
    
    7
  • >>> subprocess.run[["notepad"]]
    CompletedProcess[args=['notepad'], returncode=0]
    
    1. Một phiên bản khác của
    >>> shlex.split["echo 'Hello, World!'"]
    ['echo', 'Hello, World!']
    
    7 với nhiều thông tin hơn nhưng kỹ thuật hơn
  • >>> subprocess.run[["notepad"]]
    CompletedProcess[args=['notepad'], returncode=0]
    
    3. Triển khai Python của
    >>> shlex.split["echo 'Hello, World!'"]
    ['echo', 'Hello, World!']
    
    7 với hình ảnh đẹp mắt
  • >>> shlex.split["echo 'Hello, World!'"]
    ['echo', 'Hello, World!']
    
    6. Một tiện ích đặc biệt để khám phá cây quy trình

Trên macOS, bạn cũng có ứng dụng Giám sát hoạt động trong các tiện ích của mình. Trong menu View, nếu bạn chọn All Processes, Hierarchally, bạn sẽ có thể xem cây quy trình của mình

Bạn cũng có thể khám phá thư viện psutil của Python, cho phép bạn truy xuất thông tin quy trình đang chạy trên cả hệ thống dựa trên Windows và UNIX

Một thuộc tính chung của theo dõi quy trình trên các hệ thống là mỗi quy trình có một số nhận dạng quy trình hoặc PID, là một số nguyên duy nhất để xác định quy trình trong ngữ cảnh của hệ điều hành. Bạn sẽ thấy con số này trên hầu hết các tiện ích được liệt kê ở trên

Cùng với PID, thông thường sẽ thấy mức sử dụng tài nguyên, chẳng hạn như tỷ lệ phần trăm CPU và dung lượng RAM mà một quy trình cụ thể đang sử dụng. Đây là thông tin mà bạn tìm kiếm nếu một chương trình đang ăn cắp tất cả tài nguyên của bạn

Việc sử dụng tài nguyên của các quy trình có thể hữu ích để phát triển hoặc gỡ lỗi các tập lệnh sử dụng mô-đun

$ python timer.py 5
0, ngay cả khi bạn không cần PID hoặc bất kỳ thông tin nào về tài nguyên mà các quy trình đang sử dụng trong chính mã đó. Trong khi chơi với các ví dụ sắp tới, hãy cân nhắc để mở một biểu diễn của cây quy trình để xem các quy trình mới bật lên

Bây giờ bạn có một cái nhìn toàn cảnh về các quy trình. Bạn sẽ đào sâu mô hình tinh thần của mình trong suốt hướng dẫn, nhưng bây giờ là lúc để xem cách bắt đầu quy trình của riêng bạn với mô-đun Python

$ python timer.py 5
0

Tổng quan về Mô-đun
$ python timer.py 5
0 của Python

Mô-đun Python

$ python timer.py 5
0 dùng để khởi chạy các tiến trình con. Các quy trình này có thể là bất kỳ thứ gì từ ứng dụng GUI đến trình bao. Mối quan hệ cha-con của các quy trình là nơi phụ trong tên
$ python timer.py 5
0 đến từ. Khi bạn sử dụng
$ python timer.py 5
0, Python là cha tạo ra một tiến trình con mới. Quá trình con mới đó là gì, tùy thuộc vào bạn

Python

$ python timer.py 5
0 ban đầu được đề xuất và chấp nhận cho Python 2. 4 thay thế cho việc sử dụng mô-đun
>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
3. Một số thay đổi được ghi lại đã xảy ra muộn nhất là 3. 8. Các ví dụ trong bài viết này đã được thử nghiệm với Python 3. 10. 4, nhưng bạn chỉ cần 3. 8+ để làm theo hướng dẫn này

Hầu hết các tương tác của bạn với mô-đun Python

$ python timer.py 5
0 sẽ thông qua chức năng. 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

Khuyến nghị sử dụng

>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
5 cho tất cả các trường hợp mà nó có thể xử lý. Đối với các trường hợp cạnh mà bạn cần kiểm soát nhiều hơn, lớp có thể được sử dụng.
>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
7 là lớp cơ bản cho toàn bộ mô-đun
$ python timer.py 5
0. Tất cả các chức năng trong mô-đun
$ python timer.py 5
0 là các trình bao bọc thuận tiện xung quanh hàm tạo
>>> import shlex
>>> shlex.split["python timer.py 5"]
['python', 'timer.py', '5']

>>> subprocess.run[shlex.split["python timer.py 5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
3 và các phương thức thể hiện của nó. Gần cuối hướng dẫn này, bạn sẽ thuộc lớp
>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
7

Ghi chú. Nếu bạn đang cố gắng quyết định xem mình có cần

$ python timer.py 5
0 hay không, hãy xem phần trên

Bạn có thể bắt gặp các chức năng khác như , và , nhưng những chức năng này thuộc về API

$ python timer.py 5
0 cũ hơn từ Python 3. 5 trở về trước. Mọi thứ ba chức năng này làm có thể được sao chép với chức năng
>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
5 mới hơn. API cũ hơn chủ yếu vẫn còn đó để tương thích ngược và bạn sẽ không đề cập đến nó trong hướng dẫn này

Ngoài ra còn có một lượng dư thừa khá lớn trong mô-đun

$ python timer.py 5
0, nghĩa là có nhiều cách khác nhau để đạt được cùng một mục tiêu cuối cùng. Bạn sẽ không khám phá tất cả các biến thể trong hướng dẫn này. Tuy nhiên, những gì bạn sẽ tìm thấy là những kỹ thuật mạnh mẽ sẽ giúp bạn đi đúng hướng

Cách sử dụng cơ bản của Mô-đun
$ python timer.py 5
0 Python

Trong phần này, bạn sẽ xem xét một số ví dụ cơ bản nhất minh họa việc sử dụng mô-đun

$ python timer.py 5
0. Bạn sẽ bắt đầu bằng cách khám phá một chương trình hẹn giờ dòng lệnh cơ bản với chức năng
>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
5

Nếu bạn muốn làm theo các ví dụ, hãy tạo một thư mục mới. Tất cả các ví dụ và chương trình có thể được lưu trong thư mục này. Điều hướng đến thư mục mới được tạo này trên dòng lệnh để chuẩn bị cho các ví dụ sắp tới. Tất cả mã trong hướng dẫn này là thư viện tiêu chuẩn Python—không yêu cầu phụ thuộc bên ngoài—vì vậy không cần môi trường ảo

Loại bỏ các quảng cáo

Ví dụ về bộ đếm thời gian

Để nắm bắt được mô-đun

$ python timer.py 5
0 của Python, bạn sẽ muốn có một chương trình cơ bản để chạy và thử nghiệm với. Đối với điều này, bạn sẽ sử dụng một chương trình được viết bằng Python

# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]

Chương trình hẹn giờ sử dụng

PS> choco install processhacker
15 để chấp nhận một số nguyên làm đối số. Số nguyên biểu thị số giây mà bộ hẹn giờ sẽ đợi cho đến khi thoát, mà chương trình sử dụng
PS> choco install processhacker
16 để đạt được. Nó sẽ phát một hoạt ảnh nhỏ biểu thị từng giây trôi qua cho đến khi thoát

Nó không nhiều, nhưng điều quan trọng là nó hoạt động như một quy trình đa nền tảng chạy trong vài giây và bạn có thể dễ dàng sửa lại. Bạn sẽ gọi nó bằng

$ python timer.py 5
0 như thể nó là một tệp thực thi riêng biệt

Ghi chú. Việc gọi các chương trình Python bằng mô-đun Python

$ python timer.py 5
0 không có nhiều ý nghĩa—thường không cần các mô-đun Python khác ở trong các quy trình riêng biệt vì bạn chỉ có thể nhập chúng

Lý do chính mà bạn sẽ sử dụng các chương trình Python cho hầu hết các ví dụ trong hướng dẫn này là vì chúng đa nền tảng và rất có thể bạn đã cài đặt Python

Bạn có thể muốn nghĩ rằng bắt đầu một quy trình mới có thể là một cách gọn gàng để đạt được đồng thời, nhưng đó không phải là trường hợp sử dụng dự định cho mô-đun

$ python timer.py 5
0. Có thể những gì bạn cần là các mô-đun Python khác dành riêng cho đồng thời, được trình bày trong

Mô-đun

$ python timer.py 5
0 chủ yếu để gọi các chương trình khác ngoài Python. Nhưng, như bạn có thể thấy, bạn cũng có thể gọi Python nếu muốn. Để thảo luận thêm về các trường hợp sử dụng của
$ python timer.py 5
0, hãy xem phần này được thảo luận sâu hơn ở đâu hoặc một trong những phần sau

Được rồi, sẵn sàng để bị mắc kẹt trong. Khi bạn đã sẵn sàng chương trình

PS> choco install processhacker
22, hãy mở một phiên tương tác Python và gọi bộ đếm thời gian bằng
$ python timer.py 5
0

>>>

>>> import subprocess
>>> subprocess.run[["python", "timer.py", "5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]

Với mã này, bạn sẽ thấy hoạt ảnh phát ngay trong REPL. Bạn đã nhập

$ python timer.py 5
0 và sau đó gọi hàm
>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
5 với một danh sách các chuỗi là đối số duy nhất. Đây là tham số
PS> choco install processhacker
26 của hàm
>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
5

Khi thực thi

>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
5, quy trình hẹn giờ bắt đầu và bạn có thể thấy đầu ra của nó trong thời gian thực. Sau khi hoàn thành, nó trả về một thể hiện của lớp

Trên dòng lệnh, bạn có thể đã quen với việc khởi động chương trình bằng một chuỗi

$ python timer.py 5

Tuy nhiên, với

>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
5, bạn cần truyền lệnh theo trình tự, như trong ví dụ về
>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
5. Mỗi mục trong chuỗi đại diện cho một mục được sử dụng cho lệnh gọi hệ thống để bắt đầu một quy trình mới

Ghi chú. Gọi

>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
5 không giống như gọi các chương trình trên dòng lệnh. Hàm
>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
5 thực hiện lệnh gọi hệ thống, không cần trình bao. Bạn sẽ đề cập đến tương tác với trình bao sau

Các trình bao thường thực hiện mã thông báo của riêng chúng, đó là lý do tại sao bạn chỉ cần viết các lệnh dưới dạng một chuỗi dài trên dòng lệnh. Tuy nhiên, với mô-đun

$ python timer.py 5
0 của Python, bạn phải chia nhỏ lệnh thành các mã thông báo theo cách thủ công. Chẳng hạn, tên thực thi, cờ và đối số sẽ là một mã thông báo

Ghi chú. Bạn có thể sử dụng mô-đun

PS> choco install processhacker
35 để trợ giúp nếu cần, lưu ý rằng mô-đun này được thiết kế cho các hệ thống và có thể không hoạt động tốt trong môi trường Windows

>>>

>>> import shlex
>>> shlex.split["python timer.py 5"]
['python', 'timer.py', '5']

>>> subprocess.run[shlex.split["python timer.py 5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]

Hàm

PS> choco install processhacker
36 chia một lệnh điển hình thành các mã thông báo khác nhau cần thiết. Mô-đun
PS> choco install processhacker
35 có thể hữu ích khi không rõ cách phân chia các lệnh phức tạp hơn có các ký tự đặc biệt, như dấu cách

>>>

>>> shlex.split["echo 'Hello, World!'"]
['echo', 'Hello, World!']

Bạn sẽ lưu ý rằng thư chứa khoảng trắng được giữ nguyên dưới dạng một mã thông báo và không cần thêm dấu ngoặc kép nữa. Các dấu ngoặc kép bổ sung trên vỏ dùng để nhóm mã thông báo lại với nhau, nhưng vì

$ python timer.py 5
0 sử dụng các chuỗi, nên phần nào nên được hiểu là một mã thông báo luôn rõ ràng

Bây giờ bạn đã quen thuộc với một số kiến ​​thức cơ bản về bắt đầu các quy trình mới với mô-đun

$ python timer.py 5
0 của Python, sắp tới bạn sẽ thấy rằng bạn có thể chạy bất kỳ loại quy trình nào, không chỉ Python hoặc các chương trình dựa trên văn bản

Việc sử dụng
$ python timer.py 5
0 để chạy bất kỳ ứng dụng nào

Với

$ python timer.py 5
0, bạn không bị giới hạn trong các ứng dụng dựa trên văn bản như shell. Bạn có thể gọi bất kỳ ứng dụng nào bạn có thể bằng menu Bắt đầu hoặc thanh ứng dụng, miễn là bạn biết tên hoặc đường dẫn chính xác của chương trình mà bạn muốn chạy

>>>

>>> subprocess.run[["notepad"]]
CompletedProcess[args=['notepad'], returncode=0]

>>>

>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]

Tùy thuộc vào bản phân phối Linux của bạn, bạn có thể có một trình soạn thảo văn bản khác, chẳng hạn như

PS> choco install processhacker
42,
PS> choco install processhacker
43,
PS> choco install processhacker
44 hoặc
PS> choco install processhacker
45

>>>

PS> choco install processhacker
0

Các lệnh này sẽ mở ra một cửa sổ soạn thảo văn bản. Thông thường,

PS> choco install processhacker
29 sẽ không được trả lại cho đến khi bạn đóng cửa sổ soạn thảo. Tuy nhiên, trong trường hợp của macOS, vì bạn cần chạy quy trình trình khởi chạy
PS> choco install processhacker
47 để khởi chạy TextEdit, nên
PS> choco install processhacker
29 sẽ được trả về ngay lập tức

Các quy trình của trình khởi chạy chịu trách nhiệm khởi chạy một quy trình cụ thể và sau đó kết thúc. Đôi khi các chương trình, chẳng hạn như trình duyệt web, được tích hợp sẵn. Cơ chế của các quy trình trình khởi chạy nằm ngoài phạm vi của hướng dẫn này, nhưng đủ để nói rằng chúng có thể điều khiển cây quy trình của hệ điều hành để gán lại các mối quan hệ cha-con

Ghi chú. Có nhiều vấn đề mà ban đầu bạn có thể cần tới

$ python timer.py 5
0 để giải quyết, nhưng sau đó bạn sẽ tìm thấy một mô-đun hoặc thư viện cụ thể giải quyết vấn đề đó cho bạn. Đây có xu hướng là một chủ đề với
$ python timer.py 5
0 vì nó là một tiện ích cấp thấp

Một ví dụ về điều mà bạn có thể muốn làm với

$ python timer.py 5
0 là mở trình duyệt web đến một trang cụ thể. Tuy nhiên, đối với điều đó, có lẽ tốt nhất là sử dụng mô-đun Python
PS> choco install processhacker
52. Mô-đun
PS> choco install processhacker
52 sử dụng
$ python timer.py 5
0 nhưng xử lý tất cả các khác biệt phức tạp giữa các nền tảng và trình duyệt mà bạn có thể gặp phải

Sau đó, một lần nữa,

$ python timer.py 5
0 có thể là một công cụ cực kỳ hữu ích để hoàn thành công việc một cách nhanh chóng. Nếu bạn không cần một thư viện chính thức, thì
$ python timer.py 5
0 có thể là con dao quân đội Thụy Sĩ của bạn. Tất cả phụ thuộc vào trường hợp sử dụng của bạn. Nhiều cuộc thảo luận về chủ đề này sẽ đến

Bạn đã bắt đầu thành công các quy trình mới bằng Python. Đó là

$ python timer.py 5
0 ở mức cơ bản nhất. Tiếp theo, bạn sẽ xem xét kỹ hơn đối tượng
PS> choco install processhacker
29 được trả về từ
>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
5

Loại bỏ các quảng cáo

Đối tượng
PS> choco install processhacker
29

Khi bạn sử dụng

>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
5, giá trị trả về là một thể hiện của lớp
PS> choco install processhacker
29. Đúng như tên gọi,
>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
5 chỉ trả về đối tượng sau khi tiến trình con kết thúc. Nó có nhiều thuộc tính khác nhau có thể hữu ích, chẳng hạn như
PS> choco install processhacker
26 đã được sử dụng cho quy trình và
PS> choco install processhacker
65

Để thấy rõ điều này, bạn có thể gán kết quả của

>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
5 cho một biến, sau đó truy cập các thuộc tính của nó, chẳng hạn như
PS> choco install processhacker
67

>>>

PS> choco install processhacker
1

Quá trình này có một mã trả về cho biết lỗi, nhưng nó không đưa ra một ngoại lệ. Thông thường, khi một quy trình

$ python timer.py 5
0 không thành công, bạn sẽ luôn muốn đưa ra một ngoại lệ, điều này bạn có thể thực hiện bằng cách chuyển vào một đối số
PS> choco install processhacker
69

>>>

PS> choco install processhacker
2

Có nhiều cách khác nhau để đối phó với sự cố, một số trong số đó sẽ được đề cập trong phần tiếp theo. Điểm quan trọng cần lưu ý bây giờ là

>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
5 sẽ không nhất thiết đưa ra ngoại lệ nếu quy trình không thành công trừ khi bạn đã thông qua đối số
PS> choco install processhacker
69

PS> choco install processhacker
29 cũng có một vài thuộc tính liên quan đến đầu vào/đầu ra [I/O], bạn sẽ đề cập chi tiết hơn trong phần này. Tuy nhiên, trước khi giao tiếp với các quy trình, bạn sẽ học cách xử lý lỗi khi viết mã với
$ python timer.py 5
0

$ python timer.py 5
0 Ngoại lệ

Như bạn đã thấy trước đó, ngay cả khi một quy trình thoát với mã trả về biểu thị lỗi, Python sẽ không đưa ra ngoại lệ. Đối với hầu hết các trường hợp sử dụng của mô-đun

$ python timer.py 5
0, điều này không lý tưởng. Nếu một quy trình không thành công, bạn thường sẽ muốn xử lý nó bằng cách nào đó chứ không chỉ tiếp tục

Rất nhiều trường hợp sử dụng

$ python timer.py 5
0 liên quan đến các kịch bản cá nhân ngắn mà bạn có thể không dành nhiều thời gian cho hoặc ít nhất là không nên dành nhiều thời gian cho. Nếu bạn đang mày mò viết một kịch bản như thế này, thì bạn sẽ muốn
$ python timer.py 5
0 thất bại sớm và ầm ĩ

PS> choco install processhacker
78 cho Mã Thoát Khác Không

Nếu một quy trình trả về mã thoát khác không, bạn nên hiểu đó là một quy trình không thành công. Trái ngược với những gì bạn có thể mong đợi, mô-đun

$ python timer.py 5
0 của Python không tự động đưa ra một ngoại lệ đối với mã thoát khác không. Một quy trình bị lỗi thường không phải là thứ mà bạn muốn chương trình của mình âm thầm bỏ qua, vì vậy bạn có thể chuyển một đối số
PS> choco install processhacker
69 cho
>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
5 để đưa ra một ngoại lệ

>>>

PS> choco install processhacker
2

PS> choco install processhacker
78 được nâng lên ngay khi quy trình con chạy vào mã trả về khác không. Nếu bạn đang phát triển một kịch bản cá nhân ngắn, thì có lẽ điều này là đủ tốt cho bạn. Nếu bạn muốn xử lý lỗi khéo léo hơn, hãy đọc tiếp phần trên

Một điều cần lưu ý là

PS> choco install processhacker
78 không áp dụng cho các quy trình có thể bị treo và chặn quá trình thực thi của bạn vô thời hạn. Để đề phòng điều đó, bạn muốn tận dụng tham số
PS> choco install processhacker
84

PS> choco install processhacker
85 cho các quy trình mất quá nhiều thời gian

Đôi khi các quy trình không hoạt động tốt và chúng có thể mất quá nhiều thời gian hoặc bị treo vô thời hạn. Để xử lý những tình huống đó, bạn nên sử dụng tham số

PS> choco install processhacker
84 của hàm
>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
5

Truyền đối số

PS> choco install processhacker
88 cho
>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
5 sẽ khiến hàm tắt quy trình và gây ra lỗi
PS> choco install processhacker
85 sau một giây

>>>

PS> choco install processhacker
4

Trong ví dụ này, dấu chấm đầu tiên của hoạt ảnh hẹn giờ đã được xuất, nhưng quy trình con đã bị tắt trước khi có thể hoàn thành

Loại lỗi khác có thể xảy ra là nếu chương trình không tồn tại trên hệ thống cụ thể đó, điều này làm phát sinh một loại lỗi cuối cùng

Loại bỏ các quảng cáo

PS> choco install processhacker
91 cho các chương trình không tồn tại

Loại ngoại lệ cuối cùng mà bạn sẽ xem xét là

PS> choco install processhacker
91, loại ngoại lệ này sẽ xuất hiện nếu bạn thử và gọi một chương trình không tồn tại trên hệ thống đích

>>>

PS> choco install processhacker
5

Loại lỗi này được nêu ra bất kể là gì, vì vậy bạn không cần phải đưa ra bất kỳ đối số nào cho

PS> choco install processhacker
91

Đó là những ngoại lệ chính mà bạn sẽ gặp phải khi sử dụng mô-đun

$ python timer.py 5
0 của Python. Đối với nhiều trường hợp sử dụng, biết các ngoại lệ và đảm bảo rằng bạn sử dụng các đối số
PS> choco install processhacker
84 và
PS> choco install processhacker
96 là đủ. Đó là bởi vì nếu quy trình con không thành công, thì điều đó thường có nghĩa là tập lệnh của bạn không thành công

Tuy nhiên, nếu bạn có một chương trình phức tạp hơn, thì bạn có thể muốn xử lý lỗi một cách khéo léo hơn. Chẳng hạn, bạn có thể cần gọi nhiều tiến trình trong một khoảng thời gian dài. Đối với điều này, bạn có thể sử dụng cấu trúc

Một ví dụ về xử lý ngoại lệ

Đây là đoạn mã hiển thị các ngoại lệ chính mà bạn sẽ muốn xử lý khi sử dụng

$ python timer.py 5
0

PS> choco install processhacker
6

Đoạn mã này cho bạn thấy một ví dụ về cách bạn có thể xử lý ba trường hợp ngoại lệ chính do mô-đun

$ python timer.py 5
0 đưa ra

Bây giờ bạn đã sử dụng

$ python timer.py 5
0 ở dạng cơ bản và xử lý một số trường hợp ngoại lệ, đã đến lúc làm quen với những gì cần thiết để tương tác với trình bao

Giới thiệu về Shell và các chương trình dựa trên văn bản với
$ python timer.py 5
0

Một số trường hợp sử dụng phổ biến nhất của mô-đun

$ python timer.py 5
0 là để tương tác với các chương trình dựa trên văn bản, thường có sẵn trên trình bao. Đó là lý do tại sao trong phần này, bạn sẽ bắt đầu khám phá tất cả các bộ phận chuyển động có liên quan khi tương tác với các chương trình dựa trên văn bản và có thể đặt câu hỏi liệu bạn có cần shell hay không.

Shell thường đồng nghĩa với giao diện dòng lệnh hoặc CLI, nhưng thuật ngữ này không hoàn toàn chính xác. Thực tế, có hai quy trình riêng biệt tạo nên trải nghiệm dòng lệnh điển hình

  1. Trình thông dịch, thường được coi là toàn bộ CLI. Các trình thông dịch phổ biến là Bash trên Linux, Zsh trên macOS hoặc PowerShell trên Windows. Trong hướng dẫn này, trình thông dịch sẽ được gọi là shell
  2. Giao diện hiển thị đầu ra của trình thông dịch trong một cửa sổ và gửi các lần nhấn phím của người dùng tới trình thông dịch. Giao diện là một quá trình riêng biệt với trình bao, đôi khi được gọi là trình giả lập thiết bị đầu cuối

Khi ở trên dòng lệnh, người ta thường nghĩ rằng bạn đang tương tác trực tiếp với trình bao, nhưng bạn thực sự đang tương tác với giao diện. Giao diện đảm nhiệm việc gửi các lệnh của bạn tới trình bao và hiển thị kết quả đầu ra của trình bao lại cho bạn

Với sự khác biệt quan trọng này trong tâm trí, đã đến lúc chuyển sự chú ý của bạn sang những gì

>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
5 đang thực sự làm. Người ta thường nghĩ rằng việc gọi
>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
5 bằng cách nào đó cũng giống như gõ một lệnh trong giao diện đầu cuối, nhưng có những điểm khác biệt quan trọng

Mặc dù tất cả các quy trình mới được tạo với cùng một cuộc gọi hệ thống, ngữ cảnh mà cuộc gọi hệ thống được thực hiện là khác nhau. Hàm

>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
5 có thể thực hiện cuộc gọi hệ thống trực tiếp và không cần thông qua trình bao để thực hiện việc này

Trên thực tế, nhiều chương trình được coi là chương trình shell, chẳng hạn như Git, thực sự chỉ là các chương trình dựa trên văn bản không cần shell để chạy. Điều này đặc biệt đúng với môi trường UNIX, nơi tất cả các tiện ích quen thuộc như

$ python timer.py 5
3,
PS> choco install sysinternals
08,
PS> choco install sysinternals
09 và
PS> choco install sysinternals
10 thực sự là các tệp thực thi riêng biệt có thể được gọi trực tiếp.

>>>

PS> choco install processhacker
7

Tuy nhiên, có một số công cụ dành riêng cho trình bao. Việc tìm kiếm các công cụ được nhúng trong trình bao phổ biến hơn nhiều trên các trình bao Windows như PowerShell, trong đó các lệnh như

$ python timer.py 5
3 là một phần của chính trình bao chứ không phải các tệp thực thi riêng biệt như trong môi trường UNIX

>>>

PS> choco install processhacker
8

Trong PowerShell,

$ python timer.py 5
3 là bí danh mặc định cho
PS> choco install sysinternals
13, nhưng cách gọi đó cũng không hoạt động vì
PS> choco install sysinternals
13 không phải là tệp thực thi riêng biệt—nó là một phần của chính PowerShell

Thực tế là nhiều chương trình dựa trên văn bản có thể hoạt động độc lập với trình bao có thể khiến bạn tự hỏi liệu bạn có thể loại bỏ quy trình trung gian hay không—cụ thể là trình bao—và sử dụng trực tiếp

$ python timer.py 5
0 với các chương trình dựa trên văn bản thường được kết hợp với trình bao

Loại bỏ các quảng cáo

Các trường hợp sử dụng cho Shell và
$ python timer.py 5
0

Có một số lý do phổ biến khiến bạn có thể muốn gọi trình bao bằng mô-đun quy trình con

PS> choco install sysinternals
17

  • Khi bạn biết một số lệnh nhất định chỉ khả dụng thông qua trình bao, điều này phổ biến hơn trong Windows
  • Khi bạn có kinh nghiệm viết shell script với một shell cụ thể, vì vậy bạn muốn tận dụng khả năng của mình ở đó để thực hiện một số tác vụ nhất định trong khi vẫn làm việc chủ yếu bằng Python
  • Khi bạn đã kế thừa một shell script lớn có thể không làm được gì mà Python không làm được, nhưng sẽ mất nhiều thời gian để triển khai lại trong Python

Đây không phải là một danh sách đầy đủ

Bạn có thể sử dụng trình bao để ngắt chương trình hoặc để thực hiện một số thao tác xử lý văn bản. Tuy nhiên, cú pháp có thể rất khó hiểu khi so sánh với Python. Với Python, quy trình xử lý văn bản dễ viết hơn, dễ bảo trì hơn, hiệu suất cao hơn và đa nền tảng để khởi động. Vì vậy, nó rất đáng để xem xét việc không có vỏ

Tuy nhiên, điều thường xảy ra là bạn không có thời gian hoặc không đáng để nỗ lực triển khai lại các tập lệnh shell hiện có trong Python. Trong những trường hợp đó, sử dụng

$ python timer.py 5
0 cho một số Python cẩu thả không phải là điều xấu

Những lý do phổ biến để sử dụng bản thân

$ python timer.py 5
0 cũng tương tự như việc sử dụng shell với
$ python timer.py 5
0

  • Khi bạn phải sử dụng hoặc phân tích hộp đen, hoặc thậm chí là hộp trắng
  • Khi bạn muốn một trình bao bọc cho một ứng dụng
  • Khi bạn cần khởi chạy một ứng dụng khác
  • Là một giải pháp thay thế cho các tập lệnh Shell cơ bản

Ghi chú. Hộp đen có thể là một chương trình có thể được sử dụng miễn phí nhưng không có mã nguồn, vì vậy không có cách nào để biết chính xác nó làm gì và không có cách nào để sửa đổi phần bên trong của nó

Tương tự, hộp trắng có thể là chương trình có sẵn mã nguồn nhưng không thay đổi được. Nó cũng có thể là một chương trình có mã nguồn mà bạn có thể thay đổi, nhưng độ phức tạp của nó có nghĩa là bạn sẽ mất nhiều thời gian để hiểu nó để có thể thay đổi nó.

Trong những trường hợp này, bạn có thể sử dụng

$ python timer.py 5
0 để bọc các hộp có độ mờ khác nhau, bỏ qua mọi nhu cầu thay đổi hoặc triển khai lại mọi thứ trong Python

Thường thì bạn sẽ thấy rằng đối với

$ python timer.py 5
0 trường hợp sử dụng, sẽ có một thư viện dành riêng cho nhiệm vụ đó. Ở phần sau của hướng dẫn, bạn sẽ kiểm tra một môi trường ảo hoàn chỉnh và một kho lưu trữ Git được khởi tạo đầy đủ. Tuy nhiên, các thư viện Cookiecutter và Copier đã tồn tại cho mục đích đó

Mặc dù các thư viện cụ thể có thể thực hiện nhiệm vụ của bạn, nhưng vẫn có thể đáng để thực hiện với

$ python timer.py 5
0. Thứ nhất, bạn có thể thực hiện những gì bạn đã biết cách làm nhanh hơn nhiều so với việc học một thư viện mới

Ngoài ra, nếu bạn đang chia sẻ tập lệnh này với bạn bè hoặc đồng nghiệp, sẽ rất thuận tiện nếu tập lệnh của bạn hoàn toàn là Python mà không có bất kỳ phần phụ thuộc nào khác, đặc biệt nếu tập lệnh của bạn cần hoạt động trên các môi trường tối thiểu như máy chủ hoặc hệ thống nhúng

Tuy nhiên, nếu bạn đang sử dụng

$ python timer.py 5
0 thay vì
PS> choco install sysinternals
25 để đọc và ghi một số tệp bằng Bash, bạn có thể cân nhắc học cách đọc và viết bằng Python. Học cách đọc và ghi tệp không mất nhiều thời gian và nó chắc chắn sẽ xứng đáng với một nhiệm vụ thông thường như vậy

Ngoài ra, đã đến lúc làm quen với môi trường shell trên cả hệ thống dựa trên Windows và UNIX

Cách sử dụng cơ bản của
$ python timer.py 5
0 với Shell dựa trên UNIX

Để chạy lệnh shell bằng cách sử dụng

>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
5,
PS> choco install processhacker
26 phải chứa shell mà bạn muốn sử dụng, cờ để cho biết rằng bạn muốn nó chạy một lệnh cụ thể và lệnh mà bạn đang chuyển vào

>>>

PS> choco install processhacker
9

Ở đây một lệnh shell phổ biến được trình bày. Nó sử dụng

$ python timer.py 5
3 dẫn vào
PS> choco install sysinternals
09 để lọc một số mục nhập. Shell tiện dụng cho loại hoạt động này vì bạn có thể tận dụng lợi thế của người vận hành đường ống [
PS> choco install sysinternals
31]. Bạn sẽ bao gồm các đường ống chi tiết hơn

Bạn có thể thay thế

PS> choco install sysinternals
32 bằng vỏ bạn chọn. Cờ
PS> choco install sysinternals
33 là viết tắt của command, nhưng có thể khác tùy thuộc vào shell mà bạn đang sử dụng. Điều này gần như chính xác tương đương với những gì xảy ra khi bạn thêm đối số
PS> choco install sysinternals
34

>>>

PS> choco install sysinternals
0

Đối số

PS> choco install sysinternals
34 sử dụng ngầm
PS> choco install sysinternals
36, vì vậy nó gần như tương đương với ví dụ trước

Ghi chú. Trên các hệ thống dựa trên UNIX, trình bao

PS> choco install sysinternals
37 theo truyền thống là trình bao Bourne. Điều đó nói rằng, trình bao Bourne hiện đã khá cũ, vì vậy nhiều hệ điều hành sử dụng
PS> choco install sysinternals
37 làm liên kết đến Bash hoặc

Điều này thường có thể khác với trình bao được sử dụng với giao diện đầu cuối mà bạn tương tác. Ví dụ: kể từ macOS Catalina, trình bao mặc định mà bạn sẽ tìm thấy trên ứng dụng dòng lệnh đã thay đổi từ Bash thành Zsh, nhưng

PS> choco install sysinternals
37 thường vẫn trỏ đến Bash. Tương tự như vậy, trên Ubuntu,
PS> choco install sysinternals
37 trỏ đến Dash, nhưng mặc định mà bạn thường tương tác trên ứng dụng dòng lệnh vẫn là Bash

Vì vậy, việc gọi

PS> choco install sysinternals
37 trên hệ thống của bạn có thể dẫn đến một hệ vỏ khác với những gì được tìm thấy trong hướng dẫn này. Tuy nhiên, tất cả các ví dụ vẫn hoạt động

Bạn sẽ lưu ý rằng mã thông báo sau

PS> choco install sysinternals
42 phải là một mã thông báo duy nhất, bao gồm tất cả các khoảng trắng. Ở đây bạn đang trao quyền điều khiển cho trình bao để phân tích cú pháp lệnh. Nếu bạn bao gồm nhiều mã thông báo hơn, điều này sẽ được hiểu là có nhiều tùy chọn hơn để chuyển sang trình bao có thể thực thi được, chứ không phải là các lệnh bổ sung để chạy bên trong trình bao

Loại bỏ các quảng cáo

Cách sử dụng cơ bản của
$ python timer.py 5
0 Với Windows Shell

Trong phần này, bạn sẽ đề cập đến cách sử dụng cơ bản shell với

$ python timer.py 5
0 trong môi trường Windows

Để chạy lệnh shell bằng cách sử dụng

>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
5,
PS> choco install processhacker
26 phải chứa shell mà bạn muốn sử dụng, cờ để cho biết rằng bạn muốn nó chạy một lệnh cụ thể và lệnh mà bạn đang chuyển vào

>>>

PS> choco install sysinternals
1

Lưu ý rằng cả

PS> choco install sysinternals
47 và
PS> choco install sysinternals
48 đều hoạt động. Nếu bạn không có PowerShell Core, thì bạn có thể gọi
PS> choco install sysinternals
49 hoặc
PS> choco install sysinternals
50

Bạn sẽ lưu ý rằng mã thông báo sau

PS> choco install sysinternals
51 phải là một mã thông báo duy nhất, bao gồm tất cả các khoảng trắng. Ở đây bạn đang trao quyền điều khiển cho trình bao để phân tích cú pháp lệnh. Nếu bạn bao gồm nhiều mã thông báo hơn, điều này sẽ được hiểu là có nhiều tùy chọn hơn để chuyển sang trình bao có thể thực thi được, chứ không phải là các lệnh bổ sung để chạy bên trong trình bao

Nếu bạn cần Dấu nhắc Lệnh, thì tệp thực thi là

PS> choco install sysinternals
52 hoặc
PS> choco install sysinternals
53 và cờ để chỉ ra rằng mã thông báo sau đây là lệnh là
PS> choco install sysinternals
54

>>>

PS> choco install sysinternals
2

Ví dụ cuối cùng này chính xác tương đương với việc gọi

>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
5 với
PS> choco install sysinternals
34. Nói cách khác, sử dụng đối số
PS> choco install sysinternals
34 giống như thêm
PS> choco install sysinternals
58 và
PS> choco install sysinternals
59 vào danh sách đối số của bạn

Ghi chú. Quá trình phát triển của Windows rất khác so với quá trình phát triển của các hệ thống dựa trên UNIX. Shell được biết đến rộng rãi nhất là Windows Command Prompt, hiện là Shell kế thừa. Dấu nhắc lệnh được tạo để mô phỏng môi trường MS-DOS trước Windows. Nhiều shell script, hoặc hàng loạt

PS> choco install sysinternals
60 script, được viết cho môi trường này vẫn còn được sử dụng cho đến ngày nay

Hàm

>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
5 với tham số
PS> choco install sysinternals
62 hầu như sẽ luôn kết thúc bằng Dấu nhắc Lệnh. Mô-đun
$ python timer.py 5
0 sử dụng biến môi trường Windows
PS> choco install sysinternals
64, mà trong hầu hết các trường hợp sẽ trỏ đến
PS> choco install sysinternals
53, Dấu nhắc Lệnh. Hiện tại, có rất nhiều chương trình tương đương với
PS> choco install sysinternals
64 với
PS> choco install sysinternals
53 nên việc thay đổi chương trình sẽ gây ra nhiều sự cố ở những nơi không mong muốn. Vì vậy, thay đổi
PS> choco install sysinternals
64 thường không được khuyến khích

Tại thời điểm này, bạn nên biết về một vấn đề bảo mật quan trọng mà bạn sẽ muốn biết nếu bạn có các phần tử hướng tới người dùng trong chương trình Python của mình, bất kể hệ điều hành là gì. Đó là một lỗ hổng không chỉ giới hạn ở

$ python timer.py 5
0. Hơn nữa, nó có thể được khai thác trong nhiều lĩnh vực khác nhau

Cảnh báo bảo mật

Nếu tại bất kỳ thời điểm nào bạn dự định lấy đầu vào của người dùng và bằng cách nào đó dịch nó thành lệnh gọi tới

$ python timer.py 5
0, thì bạn phải hết sức cẩn thận trước các cuộc tấn công tiêm nhiễm. Đó là, tính đến các tác nhân độc hại tiềm ẩn. Có nhiều cách để gây ra sự tàn phá nếu bạn cứ để mọi người chạy mã trên máy của mình

Để sử dụng một ví dụ rất đơn giản, nơi bạn lấy đầu vào của người dùng và gửi nó, chưa được lọc, tới quy trình con để chạy trên trình bao

PS> choco install sysinternals
3

PS> choco install sysinternals
4

Bạn có thể tưởng tượng trường hợp sử dụng dự định là bọc

$ python timer.py 5
3 và thêm thứ gì đó vào nó. Vì vậy, hành vi dự kiến ​​của người dùng là cung cấp một đường dẫn như
PS> choco install sysinternals
72. Tuy nhiên, nếu một tác nhân độc hại nhận ra điều gì đang xảy ra, họ có thể thực thi hầu hết mọi mã mà họ muốn. Lấy ví dụ sau đây, nhưng hãy cẩn thận với điều này

PS> choco install sysinternals
73

PS> choco install sysinternals
74

Một lần nữa, hãy cẩn thận. Những dòng trông ngây thơ này có thể thử và xóa mọi thứ trên hệ thống. Trong trường hợp này, phần độc hại nằm trong dấu ngoặc kép nên nó sẽ không chạy, nhưng nếu không có dấu ngoặc kép thì bạn sẽ gặp rắc rối. Phần quan trọng thực hiện điều này là lệnh gọi tới

PS> choco install sysinternals
08 với các cờ có liên quan để xóa đệ quy tất cả các tệp, thư mục và thư mục con và nó sẽ hoạt động để buộc xóa thông qua. Nó có thể chạy
PS> choco install sysinternals
76 và có khả năng là
PS> choco install sysinternals
08 dưới dạng các lệnh hoàn toàn riêng biệt bằng cách thêm dấu chấm phẩy, đóng vai trò là dấu phân cách lệnh cho phép nhiều dòng mã thường chạy trên một dòng

Việc chạy các lệnh độc hại này sẽ gây ra thiệt hại không thể khắc phục đối với hệ thống tệp và sẽ yêu cầu cài đặt lại hệ điều hành. Cẩn thận

May mắn thay, hệ điều hành sẽ không cho phép bạn làm điều này với một số tệp đặc biệt quan trọng. Lệnh

PS> choco install sysinternals
08 sẽ cần sử dụng
PS> choco install sysinternals
79 trong các hệ thống dựa trên UNIX hoặc được chạy với tư cách quản trị viên trong Windows để hoàn toàn thành công trong tình trạng lộn xộn của nó. Tuy nhiên, lệnh có thể sẽ xóa rất nhiều nội dung quan trọng trước khi dừng

Vì vậy, hãy đảm bảo rằng nếu bạn đang xây dựng động các đầu vào của người dùng để cung cấp cho một cuộc gọi

$ python timer.py 5
0, thì bạn phải hết sức cẩn thận. Với cảnh báo đó, sắp tới bạn sẽ đề cập đến việc sử dụng kết quả đầu ra của các lệnh và xâu chuỗi các lệnh lại với nhau—nói ngắn gọn là cách giao tiếp với các quy trình sau khi chúng bắt đầu

Loại bỏ các quảng cáo

Giao tiếp với các quy trình

Bạn đã sử dụng mô-đun

$ python timer.py 5
0 để thực thi các chương trình và gửi các lệnh cơ bản tới trình bao. Nhưng một cái gì đó quan trọng vẫn còn thiếu. Đối với nhiều tác vụ mà bạn có thể muốn sử dụng
$ python timer.py 5
0, bạn có thể muốn tự động gửi đầu vào hoặc sử dụng đầu ra trong mã Python của mình sau

Để giao tiếp với quy trình của bạn, trước tiên bạn nên hiểu một chút về cách các quy trình giao tiếp nói chung, sau đó bạn sẽ xem xét hai ví dụ để hiểu rõ các khái niệm

Luồng I/O tiêu chuẩn

Một luồng ở mức cơ bản nhất đại diện cho một chuỗi các phần tử không có sẵn cùng một lúc. Khi bạn đọc các ký tự và dòng từ một tệp, bạn đang làm việc với một luồng ở dạng một đối tượng tệp, đối tượng cơ bản nhất của nó là một. Bộ mô tả tệp thường được sử dụng cho luồng. Vì vậy, không có gì lạ khi thấy các thuật ngữ luồng, tệp và giống như tệp được sử dụng thay thế cho nhau

Khi các quy trình được khởi tạo, có ba luồng đặc biệt mà một quy trình sử dụng. Một quá trình làm như sau

  1. Đọc
    PS> choco install sysinternals
    
    83 cho đầu vào
  2. Ghi vào
    PS> choco install sysinternals
    
    84 cho đầu ra chung
  3. Viết thư cho
    PS> choco install sysinternals
    
    85 để báo cáo lỗi

Đây là các luồng tiêu chuẩn—một mẫu đa nền tảng để giao tiếp theo quy trình

Đôi khi tiến trình con kế thừa các luồng này từ tiến trình cha. Đây là những gì đang xảy ra khi bạn sử dụng

PS> choco install sysinternals
86 trong REPL và có thể thấy đầu ra của lệnh.
PS> choco install sysinternals
84 của trình thông dịch Python được kế thừa bởi quy trình con

Khi bạn đang ở trong môi trường REPL, bạn đang xem quy trình giao diện dòng lệnh, hoàn chỉnh với ba luồng I/O tiêu chuẩn. Giao diện có quy trình shell là quy trình con, bản thân nó có Python REPL khi còn nhỏ. Trong tình huống này, trừ khi bạn chỉ định khác,

PS> choco install sysinternals
83 sẽ xuất phát từ bàn phím, trong khi
PS> choco install sysinternals
84 và
PS> choco install sysinternals
85 được hiển thị trên màn hình. Giao diện, trình bao và REPL chia sẻ các luồng

Bạn có thể coi các luồng I/O tiêu chuẩn là bộ phân phối byte. Quy trình con điền vào

PS> choco install sysinternals
84 và
PS> choco install sysinternals
85, và bạn điền vào
PS> choco install sysinternals
83. Sau đó, bạn đọc các byte trong
PS> choco install sysinternals
84 và
PS> choco install sysinternals
85, và quy trình con đọc từ
PS> choco install sysinternals
83

Như với một bộ phân phối, bạn có thể dự trữ

PS> choco install sysinternals
83 trước khi nó được liên kết với một quy trình con. Quá trình con sau đó sẽ đọc từ
PS> choco install sysinternals
83 khi và khi nó cần. Tuy nhiên, khi một quá trình đã đọc từ một luồng, các byte sẽ được phân phối. Bạn không thể quay lại và đọc lại chúng

Ba luồng hoặc tệp này là cơ sở để giao tiếp với quy trình của bạn. Trong phần tiếp theo, bạn sẽ bắt đầu thấy điều này hoạt động bằng cách lấy đầu ra của chương trình tạo số ma thuật

Ví dụ về trình tạo số ma thuật

Thông thường, khi sử dụng mô-đun

$ python timer.py 5
0, bạn sẽ muốn sử dụng đầu ra cho một thứ gì đó chứ không chỉ hiển thị đầu ra như bạn vẫn làm từ trước đến nay. Trong phần này, bạn sẽ sử dụng một trình tạo số ma thuật để xuất ra một số ma thuật.

Hãy tưởng tượng rằng trình tạo số ma thuật là một chương trình tối nghĩa nào đó, một hộp đen, được kế thừa qua nhiều thế hệ quản trị viên hệ thống trong công việc của bạn. Nó đưa ra một con số kỳ diệu mà bạn cần cho các phép tính bí mật của mình. Bạn sẽ đọc từ

PS> choco install sysinternals
84 của
$ python timer.py 5
0 và sử dụng nó trong chương trình Python bao bọc của bạn

PS> choco install sysinternals
5

Được rồi, không thực sự quá kỳ diệu. Điều đó nói rằng, đó không phải là trình tạo số ma thuật mà bạn quan tâm—nó đang tương tác với một hộp đen giả định với

$ python timer.py 5
0, điều đó thật thú vị. Để lấy đầu ra của trình tạo số để sử dụng sau này, bạn có thể chuyển đối số
# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
03 thành
>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
5

>>>

PS> choco install sysinternals
6

Truyền một đối số

# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
05 của
# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
06 đến
>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
5 làm cho đầu ra của quy trình có sẵn tại thuộc tính
# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
08 của đối tượng quy trình đã hoàn thành. Bạn sẽ lưu ý rằng nó được trả về dưới dạng , vì vậy bạn cần lưu ý khi đọc nó

Cũng lưu ý rằng thuộc tính

# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
08 của
PS> choco install processhacker
29 không còn là luồng nữa. Luồng đã được đọc và nó được lưu trữ dưới dạng đối tượng byte trong thuộc tính
# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
08

Với đầu ra có sẵn, bạn có thể sử dụng nhiều hơn một quy trình con để lấy các giá trị và thao tác trên chúng trong mã của mình

>>>

PS> choco install sysinternals
7

Trong ví dụ này, bạn bắt đầu hai quy trình số ma thuật lấy hai số ma thuật rồi cộng chúng lại với nhau. Hiện tại, bạn dựa vào việc giải mã tự động đối tượng byte bằng hàm tạo

# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
12. Tuy nhiên, trong phần tiếp theo, bạn sẽ học cách giải mã và mã hóa rõ ràng

Loại bỏ các quảng cáo

Giải mã các luồng tiêu chuẩn

Các quy trình giao tiếp theo byte và bạn có một vài cách khác nhau để xử lý việc mã hóa và giải mã các byte này. Bên dưới bề mặt,

$ python timer.py 5
0 có một vài cách để vào

Chế độ văn bản có nghĩa là

$ python timer.py 5
0 sẽ cố gắng tự mã hóa. Để làm điều đó, nó cần biết mã hóa ký tự nào sẽ sử dụng. Hầu hết các tùy chọn để thực hiện việc này trong
$ python timer.py 5
0 sẽ cố gắng sử dụng mã hóa mặc định. Tuy nhiên, bạn thường ngăn chặn một lỗi khó tìm thấy trong tương lai

Bạn có thể chuyển một đối số

# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
16 để Python xử lý việc mã hóa bằng cách sử dụng mã hóa mặc định. Tuy nhiên, như đã đề cập, việc chỉ định mã hóa một cách rõ ràng bằng cách sử dụng đối số
# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
17 luôn an toàn hơn, vì không phải tất cả các hệ thống đều hoạt động với UTF-8 gần như phổ biến

>>>

PS> choco install sysinternals
8

Nếu ở chế độ văn bản, thuộc tính

# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
08 trên
PS> choco install processhacker
29 hiện là một chuỗi chứ không phải đối tượng byte

Bạn cũng có thể giải mã các byte được trả về bằng cách gọi trực tiếp phương thức

# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
20 trên thuộc tính
PS> choco install sysinternals
84 mà hoàn toàn không yêu cầu chế độ văn bản

>>>

PS> choco install sysinternals
9

Có nhiều cách khác để đưa

>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
5 vào chế độ văn bản. Bạn cũng có thể đặt giá trị
# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
06 cho
# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
24 hoặc
# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
25, điều này cũng sẽ đặt
>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
5 ở chế độ văn bản. Điều này có vẻ dư thừa, nhưng phần lớn trong số này được giữ lại để tương thích ngược, vì mô-đun
$ python timer.py 5
0 đã thay đổi qua nhiều năm

Bây giờ bạn đã biết cách đọc và giải mã đầu ra của một quy trình, đã đến lúc xem xét việc ghi vào đầu vào của một quy trình

Ví dụ về trò chơi phản ứng

Trong phần này, bạn sẽ sử dụng

$ python timer.py 5
0 để tương tác với trò chơi dòng lệnh. Đó là một chương trình cơ bản được thiết kế để kiểm tra thời gian phản ứng của con người. Tuy nhiên, với kiến ​​thức của bạn về các luồng I/O tiêu chuẩn, bạn sẽ có thể hack nó. Mã nguồn của trò chơi sử dụng mô-đun
# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
29 và
# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
30

# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
0

Chương trình bắt đầu, yêu cầu người dùng nhấn enter, sau một khoảng thời gian ngẫu nhiên sẽ yêu cầu người dùng nhấn enter lần nữa. Nó tính từ lúc thông báo xuất hiện cho đến khi người dùng nhấn enter, hoặc ít nhất đó là suy nghĩ của nhà phát triển game

Hàm

# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
31 sẽ đọc từ
PS> choco install sysinternals
83 cho đến khi xuống một dòng mới, có nghĩa là một lần nhấn phím Enter trong ngữ cảnh này. Nó trả về mọi thứ nó tiêu thụ từ
PS> choco install sysinternals
83 ngoại trừ dòng mới. Với kiến ​​thức đó, bạn có thể sử dụng
$ python timer.py 5
0 để tương tác với trò chơi này.

>>>

# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
1

Thời gian phản ứng là 0 mili giây. Không tệ. Xem xét thời gian phản ứng trung bình của con người là khoảng 270 mili giây, chương trình của bạn chắc chắn là siêu phàm. Lưu ý rằng trò chơi làm tròn đầu ra của nó, vì vậy 0 mili giây không có nghĩa là nó diễn ra tức thời

Đối số

# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
35 được chuyển đến
>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
5 là một chuỗi bao gồm hai dòng mới. Tham số
# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
17 được đặt thành
# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
38, đặt
>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
5 ở chế độ văn bản. Điều này thiết lập quy trình để nó nhận thông tin đầu vào mà bạn cung cấp cho nó

Trước khi chương trình bắt đầu,

PS> choco install sysinternals
83 được lưu trữ, chờ chương trình sử dụng các dòng mới mà nó chứa. Một dòng mới được sử dụng để bắt đầu trò chơi và dòng mới tiếp theo được sử dụng để phản ứng với
# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
41

Bây giờ bạn đã biết chuyện gì đang xảy ra—cụ thể là có thể dự trữ

PS> choco install sysinternals
83 như trước đây—bạn có thể tự hack chương trình mà không cần
$ python timer.py 5
0. Nếu bạn bắt đầu trò chơi và sau đó nhấn Enter một vài lần, trò chơi đó sẽ tích trữ
PS> choco install sysinternals
83 với một số dòng mới mà chương trình sẽ tự động sử dụng sau khi nhận được . Vì vậy, thời gian phản ứng của bạn thực sự chỉ là thời gian cần thiết để trò chơi phản ứng thực hiện
# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
46 và sử dụng thông tin đầu vào.

Tuy nhiên, nhà phát triển trò chơi đã khôn ngoan với điều này và thề sẽ phát hành một phiên bản khác, phiên bản này sẽ bảo vệ chống lại việc khai thác này. Trong thời gian chờ đợi, bạn sẽ tìm hiểu sâu hơn một chút về

$ python timer.py 5
0 và tìm hiểu về cách nó kết nối các luồng I/O tiêu chuẩn

Loại bỏ các quảng cáo

Đường ống và Shell

Để thực sự hiểu các quy trình con và chuyển hướng luồng, bạn thực sự cần hiểu các đường ống và chúng là gì. This is especially true if you want to wire up two processes together, feeding one

PS> choco install sysinternals
84 into another process’s
PS> choco install sysinternals
83, for instance. In this section, you’ll be coming to grips with pipes and how to use them with the
$ python timer.py 5
0 module

Introduction to Pipes

A pipe, or pipeline, is a special stream that, instead of having one file handle as most files do, has two. One handle is read-only, and the other is write-only. The name is very descriptive—a pipe serves to pipe a byte stream from one process to another. It’s also buffered, so a process can write to it, and it’ll hold onto those bytes until it’s read, like a dispenser

You may be used to seeing pipes on the command line, as you did in the

# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
2

This command tells the shell to create an

$ python timer.py 5
3 process to list all the files in
# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
52. The pipe operator [
PS> choco install sysinternals
31] tells the shell to create a pipe from the
PS> choco install sysinternals
84 of the
$ python timer.py 5
3 process and feed it into the
PS> choco install sysinternals
83 of the
PS> choco install sysinternals
09 process. The
PS> choco install sysinternals
09 process filters out all the lines that don’t contain the string
# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
59

Windows doesn’t have

PS> choco install sysinternals
09, but a rough equivalent of the same command would be as follows

# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
3

However, on Windows PowerShell, things work very differently. As you learned in the of this tutorial, the different commands are not separate executables. Therefore, PowerShell is internally redirecting the output of one command into another without starting new processes

Note. If you don’t have access to a UNIX-based operating system but have Windows 10 or above, then you actually do have access to a UNIX-based operating system. Check out Windows Subsystem for Linux, which will give you access to a fully featured Linux shell

You can use pipes for different processes on PowerShell, though getting into the intricacies of which ones is outside the scope of this tutorial. For more information on PowerShell pipes, check out the documentation. So, for the rest of the pipe examples, only UNIX-based examples will be used, as the basic mechanism is the same for both systems. They’re not nearly as common on Windows, anyway

If you want to let the shell take care of piping processes into one another, then you can just pass the whole string as a command into

$ python timer.py 5
0

>>>

# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
4

This way, you can let your chosen shell take care of piping one process into another, instead of trying to reimplement things in Python. This is a perfectly valid choice in certain situations

, you’ll also come to see that you can’t pipe processes directly with

>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
5. For that, you’ll need the more complicated
>>> import shlex
>>> shlex.split["python timer.py 5"]
['python', 'timer.py', '5']

>>> subprocess.run[shlex.split["python timer.py 5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
3. Actual piping is demonstrated in , near the end of the tutorial

Whether you mean to pipe one process into another with the

$ python timer.py 5
0 module or not, the
$ python timer.py 5
0 module makes extensive use of pipes behind the scenes

The Pipes of
$ python timer.py 5
0

The Python

$ python timer.py 5
0 module uses pipes extensively to interact with the processes that it starts. In a previous example, you used the
# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
05 parameter to be able to access
PS> choco install sysinternals
84

>>>

PS> choco install sysinternals
6

# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
03 is equivalent to explicitly setting the
PS> choco install sysinternals
84 and
PS> choco install sysinternals
85 parameters to the
# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
73 constant

>>>

# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
6

The

# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
74 constant is nothing special. It’s just a number that indicates to
$ python timer.py 5
0 that a pipe should be created. The function then creates a pipe to link up to the
PS> choco install sysinternals
84 of the subprocess, which the function then reads into the
PS> choco install processhacker
29 object’s
PS> choco install sysinternals
84 attribute. By the time it’s a
PS> choco install processhacker
29, it’s no longer a pipe, but a bytes object that can be accessed multiple times

Note. Pipe buffers have a limited capacity. Depending on the system you are running on, you may easily run into that limit if you plan on holding large quantities of data in the buffer. To work around this limit, you can use normal files

You can also pass a to any of the standard stream parameters

>>>

# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
7

You can’t pass a bytes object or a string directly to the

PS> choco install sysinternals
83 argument, though. Nó cần phải là một cái gì đó giống như tập tin

Lưu ý rằng

# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
81 được trả về đầu tiên là từ lệnh gọi trả về vị trí luồng mới, trong trường hợp này là bắt đầu luồng

Tham số

# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
35 tương tự như tham số
# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
05 ở chỗ nó là một phím tắt. Sử dụng tham số
# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
35 sẽ tạo bộ đệm để lưu trữ nội dung của
# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
35, sau đó liên kết tệp với quy trình mới để đóng vai trò là
PS> choco install sysinternals
83 của nó

Để thực sự liên kết hai quy trình với một đường ống từ bên trong

$ python timer.py 5
0 là điều mà bạn không thể làm với
>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
5. Thay vào đó, bạn có thể ủy thác hệ thống ống nước cho trình bao, như bạn đã làm trước đó trong phần

Nếu bạn cần liên kết các quy trình khác nhau mà không ủy thác bất kỳ công việc nào cho trình bao, thì bạn. Bạn sẽ bao gồm

>>> import shlex
>>> shlex.split["python timer.py 5"]
['python', 'timer.py', '5']

>>> subprocess.run[shlex.split["python timer.py 5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
3 sau. Tuy nhiên, trong phần tiếp theo, bạn sẽ mô phỏng một đường ống có
>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
5 vì trong hầu hết các trường hợp, việc các quy trình được liên kết trực tiếp với nhau là không quan trọng

Mô phỏng đường ống với
>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
5

Mặc dù bạn không thể thực sự liên kết hai quy trình cùng với một đường ống bằng cách sử dụng hàm

>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
5, nhưng ít nhất là không ủy thác nó cho trình bao, bạn có thể mô phỏng đường ống bằng cách sử dụng hợp lý thuộc tính
PS> choco install sysinternals
84

Nếu bạn đang sử dụng hệ thống dựa trên UNIX, nơi hầu hết tất cả các lệnh trình bao điển hình đều là các tệp thực thi riêng biệt, thì bạn chỉ cần đặt ____60_______35 của quy trình thứ hai thành thuộc tính ____60_______08 của _______29 đầu tiên

>>>

# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
8

Ở đây, thuộc tính

# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
08 của đối tượng
PS> choco install processhacker
29 của
$ python timer.py 5
3 được đặt thành
# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
35 của
>>> import subprocess
>>> subprocess.run[["python", "timer.py", "5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
04. Điều quan trọng là nó được đặt thành
# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
35 thay vì
PS> choco install sysinternals
83. Điều này là do thuộc tính
# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
08 không phải là một đối tượng giống như tệp. Đó là một đối tượng byte, vì vậy nó không thể được sử dụng làm đối số cho
PS> choco install sysinternals
83

Thay vào đó, bạn cũng có thể thao tác trực tiếp với các tệp, đặt chúng thành các tham số luồng tiêu chuẩn. Khi sử dụng tệp, bạn đặt đối tượng tệp làm đối số thành

PS> choco install sysinternals
83, thay vì sử dụng tham số
# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
35

>>>

# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
9

Như bạn đã tìm hiểu trong phần trước, đối với Windows PowerShell, thực hiện điều gì đó như thế này hoàn toàn không có ý nghĩa gì vì hầu hết thời gian, các tiện ích này là một phần của chính PowerShell. Bởi vì bạn không xử lý các tệp thực thi riêng biệt, đường ống trở nên ít cần thiết hơn. Tuy nhiên, mô hình cho đường ống vẫn giống nhau nếu cần phải làm điều gì đó như thế này

Với hầu hết các công cụ hiện có, giờ là lúc nghĩ về một số ứng dụng thực tế cho

$ python timer.py 5
0

ý tưởng thiết thực

Khi bạn gặp vấn đề muốn giải quyết bằng Python, đôi khi mô-đun

$ python timer.py 5
0 là cách dễ nhất, mặc dù nó có thể không đúng nhất

Việc sử dụng

$ python timer.py 5
0 thường rất khó để hoạt động trên các nền tảng khác nhau và nó vốn có. Nhưng mặc dù nó có thể liên quan đến một số Python cẩu thả, nhưng việc sử dụng
$ python timer.py 5
0 có thể là một cách rất nhanh chóng và hiệu quả để giải quyết vấn đề

Như đã đề cập, đối với hầu hết các nhiệm vụ bạn có thể tưởng tượng thực hiện với

$ python timer.py 5
0, thường có một thư viện dành riêng cho nhiệm vụ cụ thể đó. Thư viện gần như chắc chắn sẽ sử dụng
$ python timer.py 5
0 và các nhà phát triển sẽ làm việc chăm chỉ để làm cho mã đáng tin cậy và giải quyết tất cả các trường hợp góc cạnh có thể khiến việc sử dụng
$ python timer.py 5
0 trở nên khó khăn

Vì vậy, mặc dù có tồn tại các thư viện chuyên dụng, nhưng việc chỉ sử dụng

$ python timer.py 5
0 thường có thể đơn giản hơn, đặc biệt nếu bạn đang ở trong một môi trường mà bạn cần hạn chế các phụ thuộc của mình

Trong các phần sau, bạn sẽ khám phá một vài ý tưởng thiết thực

Tạo một dự án mới. Một ví dụ

Giả sử bạn thường cần tạo các dự án cục bộ mới, mỗi dự án hoàn chỉnh với một môi trường ảo và được khởi tạo dưới dạng kho lưu trữ Git. Bạn có thể truy cập thư viện Cookiecutter dành riêng cho nhiệm vụ đó và đó sẽ là một ý tưởng tồi

Tuy nhiên, sử dụng Cookiecutter có nghĩa là học Cookiecutter. Hãy tưởng tượng bạn không có nhiều thời gian và dù sao thì môi trường của bạn cũng cực kỳ tối giản—tất cả những gì bạn thực sự có thể tin tưởng là Git và Python. Trong những trường hợp này,

$ python timer.py 5
0 có thể nhanh chóng thiết lập dự án cho bạn

>>> import subprocess
>>> subprocess.run[["python", "timer.py", "5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
0

Đây là một công cụ dòng lệnh mà bạn có thể gọi để bắt đầu một dự án. Nó sẽ đảm nhiệm việc tạo tệp

>>> import subprocess
>>> subprocess.run[["python", "timer.py", "5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
20 và tệp
>>> import subprocess
>>> subprocess.run[["python", "timer.py", "5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
21, sau đó nó sẽ chạy một số lệnh để tạo môi trường ảo, khởi tạo kho lưu trữ git và thực hiện cam kết đầu tiên của bạn. Nó thậm chí còn đa nền tảng, chọn sử dụng
PS> choco install sysinternals
25 để tạo các tệp và thư mục, giúp loại bỏ sự khác biệt của hệ điều hành

Điều này có thể được thực hiện với Cookiecutter? . Nhưng nếu bạn chỉ cần một cái gì đó nhanh và bẩn, sử dụng các lệnh mà bạn đã biết, thì chỉ cần sử dụng

$ python timer.py 5
0 có thể là một lựa chọn tuyệt vời

Thay đổi thuộc tính mở rộng

Dùng Dropbox có thể bạn chưa biết có cách bỏ qua file khi đồng bộ. Ví dụ: bạn có thể giữ môi trường ảo trong thư mục dự án của mình và sử dụng Dropbox để đồng bộ hóa mã nhưng giữ môi trường ảo cục bộ

Điều đó nói rằng, nó không dễ dàng như việc thêm một tệp

>>> import subprocess
>>> subprocess.run[["python", "timer.py", "5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
26. Thay vào đó, nó liên quan đến việc thêm các thuộc tính đặc biệt vào tệp, có thể được thực hiện từ dòng lệnh. Các thuộc tính này khác nhau giữa các hệ thống giống UNIX và Windows

>>> import subprocess
>>> subprocess.run[["python", "timer.py", "5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
1

>>> import subprocess
>>> subprocess.run[["python", "timer.py", "5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
2

>>> import subprocess
>>> subprocess.run[["python", "timer.py", "5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
3

Có một số dự án dựa trên UNIX, chẳng hạn như dropboxignore, sử dụng các tập lệnh shell để giúp bỏ qua các tệp và thư mục dễ dàng hơn. Mã tương đối phức tạp và không hoạt động trên Windows

Với mô-đun

$ python timer.py 5
0, bạn có thể bọc các lệnh shell khác nhau khá dễ dàng để tạo ra tiện ích của riêng mình

>>> import subprocess
>>> subprocess.run[["python", "timer.py", "5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
4

Đây là đoạn trích đơn giản hóa từ kho lưu trữ dotDropboxIgnore của tác giả. Hàm

>>> import subprocess
>>> subprocess.run[["python", "timer.py", "5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
28 phát hiện hệ điều hành bằng mô-đun
>>> import subprocess
>>> subprocess.run[["python", "timer.py", "5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
29 và trả về một đối tượng là một phần trừu tượng xung quanh hệ vỏ dành riêng cho hệ thống. Mã này chưa triển khai hành vi trên macOS, vì vậy mã sẽ tăng
>>> import subprocess
>>> subprocess.run[["python", "timer.py", "5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
30 nếu phát hiện mã đó đang chạy trên macOS

Đối tượng shell cho phép bạn gọi một phương thức

>>> import subprocess
>>> subprocess.run[["python", "timer.py", "5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
31 với danh sách các đối tượng
PS> choco install sysinternals
25 để đặt Dropbox bỏ qua các tệp đó

Trên lớp

>>> import subprocess
>>> subprocess.run[["python", "timer.py", "5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
34, hàm tạo kiểm tra xem PowerShell Core có khả dụng hay không và nếu không, sẽ quay trở lại Windows PowerShell cũ hơn, được cài đặt theo mặc định trên Windows 10

Trong phần tiếp theo, bạn sẽ xem lại một số mô-đun khác có thể thú vị cần lưu ý khi quyết định có nên sử dụng

$ python timer.py 5
0

Các mô-đun Python được liên kết với
$ python timer.py 5
0

Khi quyết định xem một nhiệm vụ nhất định có phù hợp với

$ python timer.py 5
0 hay không, có một số mô-đun liên quan mà bạn có thể muốn biết

Trước khi có

$ python timer.py 5
0, bạn có thể sử dụng
>>> import subprocess
>>> subprocess.run[["python", "timer.py", "5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
39 để chạy các lệnh. Tuy nhiên, cũng như nhiều thứ mà trước đây
>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
3 được sử dụng, các mô-đun thư viện tiêu chuẩn đã thay thế cho
>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
3, vì vậy nó chủ yếu được sử dụng nội bộ. Hầu như không có bất kỳ trường hợp sử dụng nào để tự mình sử dụng
>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
3

Có một nơi mà bạn có thể kiểm tra một số cách cũ để hoàn thành nhiệm vụ với

>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
3 và tìm hiểu cách bạn có thể làm điều tương tự với
$ python timer.py 5
0

Có thể sẽ hấp dẫn khi nghĩ rằng ___________0 có thể được sử dụng đồng thời và trong các trường hợp đơn giản, nó có thể được. Nhưng, phù hợp với triết lý cẩu thả của Python, có lẽ sẽ chỉ nhanh chóng hack một cái gì đó cùng nhau. Nếu bạn muốn thứ gì đó mạnh mẽ hơn, thì có lẽ bạn sẽ muốn bắt đầu xem xét mô-đun

>>> import subprocess
>>> subprocess.run[["python", "timer.py", "5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
46

Tùy thuộc vào nhiệm vụ mà bạn đang cố gắng thực hiện, bạn có thể hoàn thành nhiệm vụ đó với các mô-đun

>>> import subprocess
>>> subprocess.run[["python", "timer.py", "5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
47 hoặc
>>> import subprocess
>>> subprocess.run[["python", "timer.py", "5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
48. Nếu mọi thứ được viết bằng Python, thì các mô-đun này có thể là lựa chọn tốt nhất của bạn

Mô-đun

>>> import subprocess
>>> subprocess.run[["python", "timer.py", "5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
47 cũng có API cấp cao để tạo và quản lý các quy trình con, vì vậy nếu bạn muốn kiểm soát nhiều hơn đối với các quy trình song song không phải Python, thì đó có thể là một quy trình cần kiểm tra

Bây giờ là lúc đi sâu vào

$ python timer.py 5
0 và khám phá lớp
>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
7 bên dưới và hàm tạo của nó

Lớp học
>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
7

Như đã đề cập, lớp cơ sở cho toàn bộ mô-đun

$ python timer.py 5
0 là lớp
>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
7 và hàm tạo
>>> import shlex
>>> shlex.split["python timer.py 5"]
['python', 'timer.py', '5']

>>> subprocess.run[shlex.split["python timer.py 5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
3. Mỗi chức năng trong
$ python timer.py 5
0 gọi hàm tạo
>>> import shlex
>>> shlex.split["python timer.py 5"]
['python', 'timer.py', '5']

>>> subprocess.run[shlex.split["python timer.py 5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
3 dưới mui xe. Sử dụng hàm tạo
>>> import shlex
>>> shlex.split["python timer.py 5"]
['python', 'timer.py', '5']

>>> subprocess.run[shlex.split["python timer.py 5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
3 cho bạn nhiều quyền kiểm soát đối với các quy trình con mới bắt đầu

Như một bản tóm tắt nhanh, về cơ bản,

>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
5 là phương thức khởi tạo của lớp
>>> import shlex
>>> shlex.split["python timer.py 5"]
['python', 'timer.py', '5']

>>> subprocess.run[shlex.split["python timer.py 5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
3, một số thiết lập và sau đó là lệnh gọi phương thức trên đối tượng
>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
7 mới được khởi tạo. Phương thức
>>> import subprocess
>>> subprocess.run[["python", "timer.py", "5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
61 là một phương thức chặn trả về dữ liệu
PS> choco install sysinternals
84 và
PS> choco install sysinternals
85 sau khi quá trình kết thúc

Tên của

>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
7 xuất phát từ một lệnh UNIX tương tự viết tắt của pipe open. Lệnh tạo một đường ống và sau đó bắt đầu một quy trình mới gọi trình bao. Tuy nhiên, mô-đun
$ python timer.py 5
0 không tự động gọi trình bao

Hàm

>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
5 là một hàm chặn, có nghĩa là không thể tương tác động với một quy trình với nó. Tuy nhiên, hàm tạo
>>> import shlex
>>> shlex.split["python timer.py 5"]
['python', 'timer.py', '5']

>>> subprocess.run[shlex.split["python timer.py 5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
3 bắt đầu một quy trình mới và tiếp tục, khiến quy trình chạy song song

Nhà phát triển trò chơi phản ứng mà bạn đã hack trước đó đã phát hành phiên bản mới của trò chơi của họ, phiên bản mà bạn không thể gian lận bằng cách tải

PS> choco install sysinternals
83 bằng dòng mới

>>> import subprocess
>>> subprocess.run[["python", "timer.py", "5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
5

Lúc này chương trình sẽ hiển thị một ký tự ngẫu nhiên, bạn cần bấm chính xác ký tự đó để trò chơi ghi lại thời gian phản ứng của bạn

Phải làm gì?

Sử dụng
>>> import shlex
>>> shlex.split["python timer.py 5"]
['python', 'timer.py', '5']

>>> subprocess.run[shlex.split["python timer.py 5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
3

Việc sử dụng hàm tạo

>>> import shlex
>>> shlex.split["python timer.py 5"]
['python', 'timer.py', '5']

>>> subprocess.run[shlex.split["python timer.py 5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
3 rất giống với việc sử dụng hàm tạo
>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
5. Nếu có một đối số mà bạn có thể chuyển tới
>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
5, thì bạn thường có thể chuyển nó tới
>>> import shlex
>>> shlex.split["python timer.py 5"]
['python', 'timer.py', '5']

>>> subprocess.run[shlex.split["python timer.py 5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
3. Sự khác biệt cơ bản là nó không phải là một cuộc gọi chặn—thay vì đợi cho đến khi quá trình kết thúc, nó sẽ chạy quá trình song song. Vì vậy, bạn cần tính đến bản chất không chặn này nếu bạn muốn đọc đầu ra của quy trình mới

>>> import subprocess
>>> subprocess.run[["python", "timer.py", "5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
6

Chương trình này gọi quy trình hẹn giờ trong trình quản lý bối cảnh và gán

PS> choco install sysinternals
84 cho một đường ống. Sau đó, nó chạy phương thức trên đối tượng
>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
7 và đọc
PS> choco install sysinternals
84 của nó

Phương pháp

>>> import subprocess
>>> subprocess.run[["python", "timer.py", "5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
78 là một phương pháp cơ bản để kiểm tra xem một tiến trình có còn đang chạy hay không. Nếu đúng như vậy, thì
>>> import subprocess
>>> subprocess.run[["python", "timer.py", "5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
78 trả về
>>> import subprocess
>>> subprocess.run[["python", "timer.py", "5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
83. Nếu không, nó sẽ trả về mã thoát của quy trình

Sau đó, chương trình sử dụng để thử và đọc bao nhiêu byte có sẵn tại

# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
08

Ghi chú. Nếu bạn đặt đối tượng

>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
7 ở chế độ văn bản và sau đó gọi
>>> import subprocess
>>> subprocess.run[["python", "timer.py", "5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
87 trên
# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
08, cuộc gọi tới
>>> import subprocess
>>> subprocess.run[["python", "timer.py", "5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
87 sẽ bị chặn cho đến khi nó xuống một dòng mới. Trong trường hợp này, một dòng mới sẽ trùng với thời điểm kết thúc chương trình hẹn giờ. Hành vi này không được mong muốn trong tình huống này

Để đọc bao nhiêu byte có sẵn tại thời điểm đó, bỏ qua các dòng mới, bạn cần đọc với

>>> import subprocess
>>> subprocess.run[["python", "timer.py", "5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
84. Điều quan trọng cần lưu ý là
>>> import subprocess
>>> subprocess.run[["python", "timer.py", "5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
84 chỉ khả dụng trên các luồng byte, vì vậy bạn cần đảm bảo xử lý mã hóa theo cách thủ công và không sử dụng chế độ văn bản

Đầu ra của chương trình này in đầu tiên

>>> import subprocess
>>> subprocess.run[["python", "timer.py", "5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
83 vì quá trình này chưa kết thúc. Chương trình sau đó in những gì có sẵn trong
PS> choco install sysinternals
84 cho đến nay, đó là thông báo bắt đầu và ký tự đầu tiên của hoạt ảnh

Sau ba giây, bộ đếm thời gian vẫn chưa kết thúc, vì vậy bạn lại nhận được

>>> import subprocess
>>> subprocess.run[["python", "timer.py", "5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
83, cùng với hai nhân vật hoạt hình khác. Sau ba giây nữa, quá trình đã kết thúc, vì vậy
>>> import subprocess
>>> subprocess.run[["python", "timer.py", "5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
78 tạo ra
# timer.py

from argparse import ArgumentParser
from time import sleep

parser = ArgumentParser[]
parser.add_argument["time", type=int]
args = parser.parse_args[]
print[f"Starting timer of {args.time} seconds"]
for _ in range[args.time]:
    print[".", end="", flush=True]
    sleep[1]
print["Done!"]
81 và bạn nhận được các ký tự cuối cùng của hoạt ảnh và
>>> import subprocess
>>> subprocess.run[["python", "timer.py", "5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
97

>>> import subprocess
>>> subprocess.run[["python", "timer.py", "5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
7

Trong ví dụ này, bạn đã thấy hàm tạo

>>> import shlex
>>> shlex.split["python timer.py 5"]
['python', 'timer.py', '5']

>>> subprocess.run[shlex.split["python timer.py 5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
3 hoạt động rất khác so với hàm tạo
>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
5. Trong hầu hết các trường hợp, bạn không cần loại kiểm soát chi tiết này. Điều đó nói lên rằng, trong các phần tiếp theo, bạn sẽ thấy cách bạn có thể ghép nối quy trình này với quy trình khác và cách bạn có thể hack trò chơi phản ứng mới

Kết nối hai quy trình với nhau bằng đường ống

Như đã đề cập trong a, nếu bạn cần kết nối các quy trình với nhau bằng đường ống, bạn cần sử dụng hàm tạo

>>> import shlex
>>> shlex.split["python timer.py 5"]
['python', 'timer.py', '5']

>>> subprocess.run[shlex.split["python timer.py 5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
3. Điều này chủ yếu là do
>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
5 là một lệnh gọi chặn, vì vậy khi quá trình tiếp theo bắt đầu, quá trình đầu tiên đã kết thúc, nghĩa là bạn không thể liên kết trực tiếp tới
PS> choco install sysinternals
84 của nó

Quy trình này sẽ chỉ được trình bày cho các hệ thống UNIX, vì đường ống trong Windows ít phổ biến hơn nhiều, như đã đề cập trong phần

>>> import subprocess
>>> subprocess.run[["python", "timer.py", "5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
8

Trong ví dụ này, hai quá trình được bắt đầu song song. Chúng được nối với nhau bằng một đường ống chung và vòng lặp

$ python timer.py 5
03 đảm nhận việc đọc đường ống tại
PS> choco install sysinternals
84 để xuất ra các dòng

Một điểm quan trọng cần lưu ý là trái ngược với

>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
5, trả về một đối tượng
PS> choco install processhacker
29, hàm tạo
>>> import shlex
>>> shlex.split["python timer.py 5"]
['python', 'timer.py', '5']

>>> subprocess.run[shlex.split["python timer.py 5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
3 trả về một đối tượng
>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
7. Các thuộc tính luồng tiêu chuẩn của một
PS> choco install processhacker
29 trỏ tới các đối tượng hoặc chuỗi byte, nhưng các thuộc tính tương tự của một đối tượng
>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
7 trỏ tới các luồng thực tế. Điều này cho phép bạn giao tiếp với các quy trình khi chúng đang chạy

Tuy nhiên, việc bạn có thực sự cần nối các quy trình với nhau hay không lại là một vấn đề khác. Hãy tự hỏi bản thân xem có mất nhiều thứ không bằng cách dàn xếp quy trình với Python và chỉ sử dụng

>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
5. Tuy nhiên, có một số tình huống mà bạn thực sự cần
>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
7, chẳng hạn như hack phiên bản mới của trò chơi thời gian phản ứng

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

Bây giờ bạn đã biết mình có thể sử dụng

>>> import shlex
>>> shlex.split["python timer.py 5"]
['python', 'timer.py', '5']

>>> subprocess.run[shlex.split["python timer.py 5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
3 để tương tác động với một quy trình khi nó chạy, đã đến lúc chuyển kiến ​​thức đó sang khai thác lại trò chơi thời gian phản ứng

>>> import subprocess
>>> subprocess.run[["python", "timer.py", "5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
9

Với tập lệnh này, bạn đang kiểm soát hoàn toàn việc lưu vào bộ đệm của một quy trình, đó là lý do tại sao bạn chuyển các đối số như

$ python timer.py 5
14 cho quy trình Python và
$ python timer.py 5
15 thành
$ python timer.py 5
16. Các đối số này là để đảm bảo rằng không có quá trình đệm bổ sung nào đang diễn ra

Tập lệnh hoạt động bằng cách sử dụng một hàm sẽ tìm kiếm một trong danh sách các chuỗi bằng cách lấy từng ký tự một từ

PS> choco install sysinternals
84 của quy trình. Khi mỗi ký tự đi qua, tập lệnh sẽ tìm kiếm chuỗi

Ghi chú. Để làm cho điều này hoạt động trên cả hệ thống dựa trên Windows và UNIX, hai chuỗi được tìm kiếm. hoặc là

$ python timer.py 5
18 hoặc là
$ python timer.py 5
19. Dấu xuống dòng kiểu Windows cùng với dòng mới điển hình là bắt buộc trên các hệ thống Windows

Sau khi tập lệnh đã tìm thấy một trong các chuỗi mục tiêu, trong trường hợp này là chuỗi ký tự trước ký tự mục tiêu, sau đó, tập lệnh sẽ lấy ký tự tiếp theo và viết ký tự đó vào _______83 của quy trình, sau đó là một dòng mới

Với tốc độ một phần nghìn giây, nó không hoàn toàn tốt như bản hack gốc, nhưng nó vẫn rất siêu phàm. Làm tốt

Bỏ tất cả niềm vui này sang một bên, việc tương tác với các quy trình bằng cách sử dụng

>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
7 có thể rất phức tạp và dễ mắc lỗi. Trước tiên, hãy xem liệu bạn có thể sử dụng riêng
>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
5 hay không trước khi sử dụng hàm tạo
>>> import shlex
>>> shlex.split["python timer.py 5"]
['python', 'timer.py', '5']

>>> subprocess.run[shlex.split["python timer.py 5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
3

Nếu bạn thực sự cần tương tác với các quy trình ở cấp độ này, mô-đun

>>> import subprocess
>>> subprocess.run[["python", "timer.py", "5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
47 có API cấp cao để tạo và quản lý các quy trình con

Chức năng quy trình con

>>> import subprocess
>>> subprocess.run[["python", "timer.py", "5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
47 dành cho các ứng dụng phức tạp hơn của
$ python timer.py 5
0 khi bạn có thể cần sắp xếp các quy trình khác nhau. Đây có thể là trường hợp nếu bạn đang thực hiện xử lý phức tạp nhiều tệp hình ảnh, video hoặc âm thanh chẳng hạn. Nếu bạn đang sử dụng
$ python timer.py 5
0 ở cấp độ này, thì có lẽ bạn đang xây dựng một thư viện

Phần kết luận

Bạn đã hoàn thành hành trình đến với mô-đun

$ python timer.py 5
0 của Python. Bây giờ bạn sẽ có thể quyết định liệu
$ python timer.py 5
0 có phù hợp với vấn đề của bạn hay không. Bạn cũng có thể quyết định xem bạn có cần gọi trình bao hay không. Ngoài ra, bạn sẽ có thể chạy các quy trình con và tương tác với đầu vào và đầu ra của chúng

Bạn cũng có thể bắt đầu khám phá các khả năng thao tác quy trình với hàm tạo

>>> import shlex
>>> shlex.split["python timer.py 5"]
['python', 'timer.py', '5']

>>> subprocess.run[shlex.split["python timer.py 5"]]
Starting timer of 5 seconds
.....Done!
CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
3

Trên đường đi, bạn đã

  • Tìm hiểu về các quy trình nói chung
  • Đi từ cách sử dụng cơ bản đến nâng cao của
    $ python timer.py 5
    
    0
  • Hiểu cách phát sinh và xử lý lỗi khi sử dụng
    >>> subprocess.run[["gedit"]]
    CompletedProcess[args=['gedit'], returncode=0]
    
    5
  • Làm quen với shell và sự phức tạp của chúng trên cả hệ thống giống Windows và UNIX
  • Khám phá các trường hợp sử dụng cho
    $ python timer.py 5
    
    0 thông qua các ví dụ thực tế
  • Hiểu các luồng I/O tiêu chuẩn và cách tương tác với chúng
  • Làm quen với các đường ống, cả trong vỏ và với
    $ python timer.py 5
    
    0
  • Nhìn vào hàm tạo
    >>> import shlex
    >>> shlex.split["python timer.py 5"]
    ['python', 'timer.py', '5']
    
    >>> subprocess.run[shlex.split["python timer.py 5"]]
    Starting timer of 5 seconds
    .....Done!
    CompletedProcess[args=['python', 'timer.py', '5'], returncode=0]
    
    3 và sử dụng nó cho một số giao tiếp quy trình nâng cao

Bây giờ bạn đã sẵn sàng đưa nhiều tệp thực thi vào phạm vi ảnh hưởng Pythonic của mình

Mã nguồn. Nhấp vào đây để tải xuống mã nguồn miễn phí mà bạn sẽ sử dụng để làm quen với mô-đun Python

$ python timer.py 5
0

Đánh dấu là đã hoàn thành

🐍 Thủ thuật Python 💌

Nhận một Thủ thuật Python ngắn và hấp dẫn được gửi đến hộp thư đến của bạn vài ngày một lần. Không có thư rác bao giờ. Hủy đăng ký bất cứ lúc nào. Được quản lý bởi nhóm Real Python

Gửi cho tôi thủ thuật Python »

Giới thiệu về Ian Currie

Ian là một mọt sách Python, người sử dụng nó cho mọi thứ, từ mày mò đến giúp mọi người và công ty quản lý công việc hàng ngày cũng như phát triển doanh nghiệp của họ

» Thông tin thêm về Ian

Mỗi hướng dẫn tại Real Python được tạo bởi một nhóm các nhà phát triển để nó đáp ứng các tiêu chuẩn chất lượng cao của chúng tôi. Các thành viên trong nhóm đã làm việc trong hướng dẫn này là

Aldren

Bartosz

Geir Arne

Jim

kate

Bậc thầy Kỹ năng Python trong thế giới thực Với quyền truy cập không giới hạn vào Python thực

Tham gia với chúng tôi và có quyền truy cập vào hàng nghìn hướng dẫn, khóa học video thực hành và cộng đồng các Pythonistas chuyên gia

Nâng cao kỹ năng Python của bạn »

Chuyên gia Kỹ năng Python trong thế giới thực
With Unlimited Access to Real Python

Tham gia với chúng tôi và có quyền truy cập vào hàng ngàn hướng dẫn, khóa học video thực hành và cộng đồng Pythonistas chuyên gia

Nâng cao kỹ năng Python của bạn »

Bạn nghĩ sao?

Đánh giá bài viết này

Tweet Chia sẻ Chia sẻ Email

Bài học số 1 hoặc điều yêu thích mà bạn đã học được là gì?

Mẹo bình luận. Những nhận xét hữu ích nhất là những nhận xét được viết với mục đích học hỏi hoặc giúp đỡ các sinh viên khác. và nhận câu trả lời cho các câu hỏi phổ biến trong cổng thông tin hỗ trợ của chúng tôi

Các lệnh khác nhau trong python là gì?

Một số lệnh Python phổ biến là các lệnh nhập, in, phạm vi, làm tròn, cài đặt pip, len, sắp xếp, lặp như for và while so .

Lệnh nào được sử dụng để xuất văn bản từ cả trình bao python và trong mô-đun python?

print[] là lệnh bạn đang tìm kiếm. Hàm print[], câu lệnh in chính thức trong Python 2. 0, có thể được sử dụng để xuất văn bản từ cả vỏ python và trong mô-đun python.

Mô-đun lệnh trong python là gì?

Mô-đun lệnh chứa các chức năng tiện ích để làm việc với đầu ra lệnh shell trong Unix . có sẵn trong. 1. 4. Cảnh báo. Mô-đun này đã lỗi thời bởi mô-đun quy trình con.

Lệnh python 3 là gì?

Các lệnh Python 3 đã được giới thiệu với các tính năng của Python 2 và nó tương thích với python 2 nhờ sự trợ giúp của việc sử dụng một số từ khóa có sẵn để hỗ trợ các chức năng. Python 3 command was released in the year 2008. Python 3 is more intuitive to programmers and more precise while providing the result.

Chủ Đề