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
0 tương tác với hệ điều hành$ python timer.py 5
- Đưa ra các lệnh shell như
3 hoặc$ python timer.py 5
4$ python timer.py 5
- Đư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
0$ python timer.py 5
- Hiểu các trường hợp sử dụng cho
0 bằng cách xem xét các ví dụ thực tế$ python timer.py 5
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ênKhi 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ướiMã 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
0Quy 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 đếnLoại bỏ các quảng cáoQuy 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]
9Mố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ề 0Vì 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
0Loại bỏ các quảng cáoCá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 ChocolateyPS> 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
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>>> shlex.split["echo 'Hello, World!'"] ['echo', 'Hello, World!']
1. Một phiên bản khác của>>> subprocess.run[["notepad"]] CompletedProcess[args=['notepad'], returncode=0]
7 với nhiều thông tin hơn nhưng kỹ thuật hơn>>> shlex.split["echo 'Hello, World!'"] ['echo', 'Hello, World!']
3. Triển khai Python của>>> subprocess.run[["notepad"]] CompletedProcess[args=['notepad'], returncode=0]
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>>> shlex.split["echo 'Hello, World!'"] ['echo', 'Hello, World!']
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ênBâ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
0Tổng quan về Mô-đun $ python timer.py 5
0 của Python
$ python timer.py 5
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ạnPython
$ 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àyHầ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ụcKhuyế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]
7Ghi 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ênBạ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àyNgoà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ướngCách sử dụng cơ bản của Mô-đun $ python timer.py 5
0 Python
$ python timer.py 5
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]
5Nế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áoVí 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átNó 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ệtGhi 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úngLý 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 trongMô-đ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]
5Khi 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ớpTrê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ớiGhi 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 sauCá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áoGhi 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àngBâ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ảnViệc sử dụng $ python timer.py 5
0 để chạy bất kỳ ứng dụng nào
$ python timer.py 5
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
0Cá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ứcCá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ấpMộ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ảiSau đó, 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ẽ đếnBạ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Đối tượng PS> choco install processhacker
29
PS> choco install processhacker
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
1Quá 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
2Có 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
69PS> 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ệ
$ python timer.py 5
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ụcRấ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
PS> choco install processhacker
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
2PS> 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ênMộ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
84PS> choco install processhacker
85 cho các quy trình mất quá nhiều thời gian
PS> choco install processhacker
Đô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]
5Truyề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
4Trong 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áoPS> choco install processhacker
91 cho các chương trình không tồn tại
PS> choco install processhacker
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
5Loạ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ôngTuy 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
0PS> 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 raBâ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 baoGiớ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
$ python timer.py 5
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
- 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
- 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ọngMặ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àyTrê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
7Tuy 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
8Trong 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 PowerShellThự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 baoLoại bỏ các quảng cáoCác trường hợp sử dụng cho Shell và $ python timer.py 5
0
$ python timer.py 5
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ấuNhữ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 PythonThườ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ớiNgoà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ậyNgoà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
$ python timer.py 5
Để 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ơnBạ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ướcGhi 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à BashVì 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 độngBạ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 baoLoại bỏ các quảng cáoCách sử dụng cơ bản của $ python timer.py 5
0 Với Windows Shell
$ python timer.py 5
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
1Lư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
50Bạ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 baoNế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
2Ví 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ạnGhi 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 nayHà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íchTạ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 nhauCả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
3PS> choco install sysinternals
4Bạ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ày73PS> choco install sysinternals
74PS> choco install sysinternals
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òngViệ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ừngVì 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 đầuLoại bỏ các quảng cáoGiao 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
- Đọc
83 cho đầu vàoPS> choco install sysinternals
- Ghi vào
84 cho đầu ra chungPS> choco install sysinternals
- Viết thư cho
85 để báo cáo lỗiPS> choco install sysinternals
Đâ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 conKhi 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ồngBạ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
83Như 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úngBa 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ạnPS> 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
6Truyề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!"]
08Vớ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
7Trong 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àngLoại bỏ các quảng cáoGiả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àoChế độ 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 laiBạ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
8Nế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 byteBạ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
9Có 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ămBâ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!"]
0Chươ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!"]
1Thờ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!"]
41Bâ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ẩnLoạ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 moduleIntroduction 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!"]
2This 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!"]
59Windows 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!"]
3However, 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!"]
4This 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 tutorialWhether 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 scenesThe Pipes of $ python timer.py 5
0
$ python timer.py 5
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!"]
6The
# 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 timesNote. 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!"]
7You 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 tinLư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ồngTham 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ầnNế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ọngMô phỏng đường ống với >>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
5
>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
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
84Nế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
83Thay 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!"]
9Như 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ấtViệ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ănVì 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ìnhTrong 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ờiThay đổ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]
3Có 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 10Trong 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
0Các mô-đun Python được liên kết với $ python timer.py 5
0
$ python timer.py 5
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ếtTrướ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]
3Có 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
0Có 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]
46Tù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ạnMô-đ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 traBâ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
>>> subprocess.run[["gedit"]]
CompletedProcess[args=['gedit'], returncode=0]
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 đầuNhư 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úcTê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 baoHà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 songNhà 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]
5Lú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
>>> 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]
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]
6Chươ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ìnhSau đó, 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!"]
08Ghi 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 ảnhSau 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]
7Trong 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ớiKế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]
8Trong 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òngMộ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ạyTuy 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 ứngTươ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]
9Vớ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 raTậ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ỗiGhi 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 WindowsSau 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]
3Nế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 conChứ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ệnPhầ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úngBạ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]
3Trê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
0$ python timer.py 5
- Hiểu cách phát sinh và xử lý lỗi khi sử dụng
5>>> subprocess.run[["gedit"]] CompletedProcess[args=['gedit'], returncode=0]
- 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
0 thông qua các ví dụ thực tế$ python timer.py 5
- 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
0$ python timer.py 5
- Nhìn vào hàm tạo
3 và sử dụng nó cho một số giao tiếp quy trình nâng cao>>> 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]
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ề IanMỗ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ẻ EmailBà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