Usage: test.py [OPTIONS] FILENAME
Options:
--help Show this message and exit.
1 là dễ dàng nhất cho một trường hợp sử dụng đơn giản.Để sử dụng nâng cao hơn, bạn có thể sử dụng
Usage: test.py [OPTIONS] FILENAME
Options:
--help Show this message and exit.
2, nhưng tôi thích Usage: test.py [OPTIONS] FILENAME
Options:
--help Show this message and exit.
3 [Bộ tạo giao diện dòng lệnh của bộ dụng cụ tạo ra] giúp tạo các công cụ dòng lệnh với Python thực sự dễ dàng:import click
@click.command[]
@click.argument['filename', type=click.Path[exists=True, readable=True], nargs=1]
def main[filename]:
...
main[]
Sử dụng
Usage: test.py [OPTIONS] FILENAME
Options:
--help Show this message and exit.
4, bạn cũng có thể tạo các cờ tùy chỉnh như Usage: test.py [OPTIONS] FILENAME
Options:
--help Show this message and exit.
5.Điều này làm cho việc sử dụng các đối số dễ dàng hơn nhiều, vì bạn có thể xác định các loại đầu vào được kiểm tra tự động. Nó cũng tạo ra các thông báo lỗi hay và với
Usage: test.py [OPTIONS] FILENAME
Options:
--help Show this message and exit.
6, nó in thông tin sử dụng:Usage: test.py [OPTIONS] FILENAME
Options:
--help Show this message and exit.
Bạn sẽ cần cài đặt
Usage: test.py [OPTIONS] FILENAME
Options:
--help Show this message and exit.
3:# Python2:
pip install click
# Python3:
pip3 install click
Tôi cũng thích Argparse, nó sạch sẽ, đơn giản, khá chuẩn, cung cấp xử lý lỗi miễn phí và thêm tùy chọn [-h] để giúp người dùng.
Dưới đây là phiên bản không cần các tham số được đặt tên, có thể gây khó chịu cho một tập lệnh rất đơn giản:
#!/usr/bin/python3
import argparse
arg_parser = argparse.ArgumentParser[ description = "Copy source_file as target_file." ]
arg_parser.add_argument[ "source_file" ]
arg_parser.add_argument[ "target_file" ]
arguments = arg_parser.parse_args[]
source = arguments.source_file
target = arguments.target_file
print[ "Copying [{}] to [{}]".format[source, target] ]
Ví dụ về cách nó xử lý lỗi và trợ giúp cho bạn:
>my_test.py
usage: my_test.py [-h] source_file target_file
my_test.py: error: the following arguments are required: source_file, target_file
> my_test.py my_source.cpp
usage: my_test.py [-h] source_file target_file
my_test.py: error: the following arguments are required: target_file
> my_test.py -h
usage: .py [-h] source_file target_file
Copy source_file as target_file.
positional arguments:
source_file
target_file
optional arguments:
-h, --help show this help message and exit
> my_test.py my_source.cpp my_target.cpp
Copying [my_source.cpp] to [my_target.cpp]
Sử dụng hệ điều hành. đường dẫn. Phương thức tồn tại [] để kiểm tra xem đường dẫn được chỉ định có tồn tại không .. Lib/fileinput.py
Làm cách nào để lưu một tệp với tên tệp trong Python?
Nhập mô -đun ..
import fileinput for line in fileinput.input[encoding="utf-8"]: process[line]
Nhận tên tệp nguồn ..
Nhận tên tệp đích ..
Đã thay đổi trong phiên bản 3.3:
7 đã từng được nâng lên; Bây giờ nó là một bí danh của # Python2:
pip install click
# Python3:
pip3 install click
6.# Python2:
pip install click
# Python3:
pip3 install click
# Python2:
pip install click
# Python3:
pip3 install click
7 used to be raised; it is
now an alias of # Python2:
pip install click
# Python3:
pip3 install click
6.Nếu
# Python2:
pip install click
# Python3:
pip3 install click
0 được sử dụng nhiều lần, việc sử dụng thứ hai và tiếp theo sẽ không trả về không có dòng, ngoại trừ có lẽ cho việc sử dụng tương tác hoặc nếu nó đã được đặt lại một cách rõ ràng [ví dụ: sử dụng #!/usr/bin/python3
import argparse
arg_parser = argparse.ArgumentParser[ description = "Copy source_file as target_file." ]
arg_parser.add_argument[ "source_file" ]
arg_parser.add_argument[ "target_file" ]
arguments = arg_parser.parse_args[]
source = arguments.source_file
target = arguments.target_file
print[ "Copying [{}] to [{}]".format[source, target] ]
0].Các tệp trống được mở và đóng ngay lập tức; Lần duy nhất sự hiện diện của chúng trong danh sách các tên tệp là đáng chú ý là khi tập tin cuối cùng được mở là trống.
Các dòng được trả về với bất kỳ dòng mới nào, điều đó có nghĩa là dòng cuối cùng trong một tệp có thể không có.
Bạn có thể kiểm soát cách mở các tệp bằng cách cung cấp một móc mở thông qua tham số OpenHook thành
#!/usr/bin/python3
import argparse
arg_parser = argparse.ArgumentParser[ description = "Copy source_file as target_file." ]
arg_parser.add_argument[ "source_file" ]
arg_parser.add_argument[ "target_file" ]
arguments = arg_parser.parse_args[]
source = arguments.source_file
target = arguments.target_file
print[ "Copying [{}] to [{}]".format[source, target] ]
1 hoặc #!/usr/bin/python3
import argparse
arg_parser = argparse.ArgumentParser[ description = "Copy source_file as target_file." ]
arg_parser.add_argument[ "source_file" ]
arg_parser.add_argument[ "target_file" ]
arguments = arg_parser.parse_args[]
source = arguments.source_file
target = arguments.target_file
print[ "Copying [{}] to [{}]".format[source, target] ]
2. Móc phải là một hàm có hai đối số, tên tệp và chế độ và trả về một đối tượng giống như tệp được mở. Nếu mã hóa và/hoặc lỗi được chỉ định, chúng sẽ được chuyển đến hook dưới dạng các đối số từ khóa bổ sung. Mô -đun này cung cấp #!/usr/bin/python3
import argparse
arg_parser = argparse.ArgumentParser[ description = "Copy source_file as target_file." ]
arg_parser.add_argument[ "source_file" ]
arg_parser.add_argument[ "target_file" ]
arguments = arg_parser.parse_args[]
source = arguments.source_file
target = arguments.target_file
print[ "Copying [{}] to [{}]".format[source, target] ]
3 để hỗ trợ các tệp được nén.Hàm sau là giao diện chính của mô -đun này:
fileInput.Input [files = none, inplace = falseinput[files=None, inplace=False, backup='', *, mode='r', openhook=None, encoding=None, errors=None]¶Tạo một thể hiện của lớp
# Python2:
pip install click
# Python3:
pip3 install click
5. Ví dụ sẽ được sử dụng làm trạng thái toàn cầu cho các chức năng của mô -đun này và cũng được trả lại để sử dụng trong quá trình lặp. Các tham số cho hàm này sẽ được chuyển cho hàm tạo của lớp # Python2:
pip install click
# Python3:
pip3 install click
5.Ví dụ
# Python2:
pip install click
# Python3:
pip3 install click
5 có thể được sử dụng làm trình quản lý ngữ cảnh trong câu lệnh #!/usr/bin/python3
import argparse
arg_parser = argparse.ArgumentParser[ description = "Copy source_file as target_file." ]
arg_parser.add_argument[ "source_file" ]
arg_parser.add_argument[ "target_file" ]
arguments = arg_parser.parse_args[]
source = arguments.source_file
target = arguments.target_file
print[ "Copying [{}] to [{}]".format[source, target] ]
7. Trong ví dụ này, đầu vào được đóng lại sau khi tuyên bố #!/usr/bin/python3
import argparse
arg_parser = argparse.ArgumentParser[ description = "Copy source_file as target_file." ]
arg_parser.add_argument[ "source_file" ]
arg_parser.add_argument[ "target_file" ]
arguments = arg_parser.parse_args[]
source = arguments.source_file
target = arguments.target_file
print[ "Copying [{}] to [{}]".format[source, target] ]
7 bị thoát ra, ngay cả khi xảy ra ngoại lệ:with fileinput.input[files=['spam.txt', 'eggs.txt'], encoding="utf-8"] as f: for line in f: process[line]
Thay đổi trong phiên bản 3.2: Có thể được sử dụng làm trình quản lý ngữ cảnh.Can be used as a context manager.
Đã thay đổi trong phiên bản 3.8: Chế độ tham số từ khóa và Openhook hiện chỉ có từ khóa.The keyword parameters mode and openhook are now keyword-only.
Đã thay đổi trong phiên bản 3.10: Mã hóa và lỗi tham số chỉ dành cho từ khóa được thêm vào.The keyword-only parameter encoding and errors are added.
Các chức năng sau sử dụng trạng thái toàn cầu được tạo bởi
#!/usr/bin/python3
import argparse
arg_parser = argparse.ArgumentParser[ description = "Copy source_file as target_file." ]
arg_parser.add_argument[ "source_file" ]
arg_parser.add_argument[ "target_file" ]
arguments = arg_parser.parse_args[]
source = arguments.source_file
target = arguments.target_file
print[ "Copying [{}] to [{}]".format[source, target] ]
1; Nếu không có trạng thái hoạt động, usage: my_test.py [-h] source_file target_file
my_test.py: error: the following arguments are required: source_file, target_file
0 sẽ được nâng lên.
fileInput.filename []filename[]¶Trả lại tên của tệp hiện đang được đọc. Trước khi dòng đầu tiên được đọc, trả về
usage: my_test.py [-h] source_file target_file
my_test.py: error: the following arguments are required: source_file, target_file
1.
fileInput.fileno []fileno[]¶Trả về bộ mô tả tập tin số nguyên trên mạng cho tệp hiện tại. Khi không có tệp nào được mở [trước dòng đầu tiên và giữa các tệp], hãy trả về
usage: my_test.py [-h] source_file target_file
my_test.py: error: the following arguments are required: source_file, target_file
2.
FileInput.Lineno []lineno[]¶Trả về số dòng tích lũy của dòng vừa được đọc. Trước khi dòng đầu tiên được đọc, trả về
usage: my_test.py [-h] source_file target_file
my_test.py: error: the following arguments are required: source_file, target_file
3. Sau khi dòng cuối cùng của tệp cuối cùng đã được đọc, hãy trả về số dòng của dòng đó. fileinput.filelineno [] ¶filelineno[]¶Trả về số dòng trong tệp hiện tại. Trước khi dòng đầu tiên được đọc, trả về
usage: my_test.py [-h] source_file target_file
my_test.py: error: the following arguments are required: source_file, target_file
3. Sau khi dòng cuối cùng của tệp cuối cùng đã được đọc, hãy trả về số dòng của dòng đó trong tệp.
fileInput.isfirstline [] ¶isfirstline[]¶Trả về
usage: my_test.py [-h] source_file target_file
my_test.py: error: the following arguments are required: source_file, target_file
5 Nếu dòng vừa đọc là dòng đầu tiên của tệp của nó, nếu không hãy trả về usage: my_test.py [-h] source_file target_file
my_test.py: error: the following arguments are required: source_file, target_file
6.
FileInput.ISStdin []isstdin[]¶Trả về
usage: my_test.py [-h] source_file target_file
my_test.py: error: the following arguments are required: source_file, target_file
5 Nếu dòng cuối cùng được đọc từ # Python2:
pip install click
# Python3:
pip3 install click
0, nếu không thì hãy trả lại usage: my_test.py [-h] source_file target_file
my_test.py: error: the following arguments are required: source_file, target_file
6.
fileInput.nextFile [] ¶nextfile[]¶Đóng tệp hiện tại để lần lặp tiếp theo sẽ đọc dòng đầu tiên từ tệp tiếp theo [nếu có]; Các dòng không được đọc từ tệp sẽ không được tính vào số lượng dòng tích lũy. Tên tệp không được thay đổi cho đến khi dòng đầu tiên của tệp tiếp theo được đọc. Trước khi dòng đầu tiên được đọc, chức năng này không có hiệu lực; Nó không thể được sử dụng để bỏ qua tập tin đầu tiên. Sau khi dòng cuối cùng của tệp cuối cùng đã được đọc, chức năng này không có hiệu lực.
fileInput.close []close[]¶Đóng chuỗi.
Lớp thực hiện hành vi trình tự được cung cấp bởi mô -đun cũng có sẵn để phân lớp con:
classFileInput.FileInput [files = none, inplace = falsefileinput.FileInput[files=None, inplace=False, backup='', *, mode='r', openhook=None, encoding=None, errors=None]¶Lớp
# Python2:
pip install click
# Python3:
pip3 install click
5 là việc thực hiện; Các phương pháp của nó usage: my_test.py [-h] source_file target_file
my_test.py: error: the following arguments are required: target_file
1, usage: my_test.py [-h] source_file target_file
my_test.py: error: the following arguments are required: target_file
2, usage: my_test.py [-h] source_file target_file
my_test.py: error: the following arguments are required: target_file
3, usage: my_test.py [-h] source_file target_file
my_test.py: error: the following arguments are required: target_file
4, usage: my_test.py [-h] source_file target_file
my_test.py: error: the following arguments are required: target_file
5, usage: my_test.py [-h] source_file target_file
my_test.py: error: the following arguments are required: target_file
6, usage: my_test.py [-h] source_file target_file
my_test.py: error: the following arguments are required: target_file
7 và usage: my_test.py [-h] source_file target_file
my_test.py: error: the following arguments are required: target_file
8 tương ứng với các hàm của cùng tên trong mô -đun. Ngoài ra, nó có thể hiểu được và có một phương thức usage: my_test.py [-h] source_file target_file
my_test.py: error: the following arguments are required: target_file
9 trả về dòng đầu vào tiếp theo. Trình tự phải được truy cập theo thứ tự tuần tự nghiêm ngặt; Truy cập ngẫu nhiên và usage: my_test.py [-h] source_file target_file
my_test.py: error: the following arguments are required: target_file
9 không thể được trộn lẫn.iterable and has a
usage: my_test.py [-h] source_file target_file
my_test.py: error: the following arguments are required: target_file
9 method which returns the next input line. The sequence must be accessed in strictly sequential order; random access and usage: my_test.py [-h] source_file target_file
my_test.py: error: the following arguments are required: target_file
9 cannot be mixed.Với chế độ, bạn có thể chỉ định chế độ tệp nào sẽ được truyền đến
Usage: test.py [OPTIONS] FILENAME
Options:
--help Show this message and exit.
8. Nó phải là một trong usage: .py [-h] source_file target_file
Copy source_file as target_file.
positional arguments:
source_file
target_file
optional arguments:
-h, --help show this help message and exit
2 và usage: .py [-h] source_file target_file
Copy source_file as target_file.
positional arguments:
source_file
target_file
optional arguments:
-h, --help show this help message and exit
3.Openhook, khi được đưa ra, phải là một hàm có hai đối số, tên tệp và chế độ và trả về một đối tượng giống như tệp được mở. Bạn không thể sử dụng tại chỗ và Openhook cùng nhau.
Bạn có thể chỉ định mã hóa và lỗi được truyền đến
Usage: test.py [OPTIONS] FILENAME
Options:
--help Show this message and exit.
8 hoặc Openhook.Một ví dụ
# Python2:
pip install click
# Python3:
pip3 install click
5 có thể được sử dụng làm trình quản lý ngữ cảnh trong câu lệnh #!/usr/bin/python3
import argparse
arg_parser = argparse.ArgumentParser[ description = "Copy source_file as target_file." ]
arg_parser.add_argument[ "source_file" ]
arg_parser.add_argument[ "target_file" ]
arguments = arg_parser.parse_args[]
source = arguments.source_file
target = arguments.target_file
print[ "Copying [{}] to [{}]".format[source, target] ]
7. Trong ví dụ này, đầu vào được đóng lại sau khi tuyên bố #!/usr/bin/python3
import argparse
arg_parser = argparse.ArgumentParser[ description = "Copy source_file as target_file." ]
arg_parser.add_argument[ "source_file" ]
arg_parser.add_argument[ "target_file" ]
arguments = arg_parser.parse_args[]
source = arguments.source_file
target = arguments.target_file
print[ "Copying [{}] to [{}]".format[source, target] ]
7 bị thoát ra, ngay cả khi xảy ra ngoại lệ:Usage: test.py [OPTIONS] FILENAME
Options:
--help Show this message and exit.
0Thay đổi trong phiên bản 3.2: Có thể được sử dụng làm trình quản lý ngữ cảnh.Can be used as a context manager.
Đã thay đổi trong phiên bản 3.8: Chế độ tham số từ khóa và Openhook hiện chỉ có từ khóa.The keyword parameter mode and openhook are now keyword-only.
Đã thay đổi trong phiên bản 3.10: Mã hóa và lỗi tham số chỉ dành cho từ khóa được thêm vào.The keyword-only parameter encoding and errors are added.
Đã thay đổi trong phiên bản 3.11: chế độ
8 và usage: .py [-h] source_file target_file
Copy source_file as target_file.
positional arguments:
source_file
target_file
optional arguments:
-h, --help show this help message and exit
9 và phương pháp usage: .py [-h] source_file target_file
Copy source_file as target_file.
positional arguments:
source_file
target_file
optional arguments:
-h, --help show this help message and exit
0 đã bị xóa.The Copying [my_source.cpp] to [my_target.cpp]
usage: .py [-h] source_file target_file
Copy source_file as target_file.
positional arguments:
source_file
target_file
optional arguments:
-h, --help show this help message and exit
8 and usage: .py [-h] source_file target_file
Copy source_file as target_file.
positional arguments:
source_file
target_file
optional arguments:
-h, --help show this help message and exit
9 modes and the Copying [my_source.cpp] to [my_target.cpp]
0 method have been
removed.Lọc tại chỗ tùy chọn: Nếu đối số từ khóa
1 được chuyển đến Copying [my_source.cpp] to [my_target.cpp]
1 hoặc cho hàm tạo #!/usr/bin/python3
import argparse
arg_parser = argparse.ArgumentParser[ description = "Copy source_file as target_file." ]
arg_parser.add_argument[ "source_file" ]
arg_parser.add_argument[ "target_file" ]
arguments = arg_parser.parse_args[]
source = arguments.source_file
target = arguments.target_file
print[ "Copying [{}] to [{}]".format[source, target] ]
5, tệp được chuyển sang tệp sao lưu và đầu ra tiêu chuẩn được chuyển đến tệp đầu vào [nếu một tệp cùng tên với tệp sao lưu đã tồn tại, nó sẽ được thay thế âm thầm]. Điều này cho phép viết một bộ lọc viết lại tệp đầu vào của nó. Nếu tham số sao lưu được cung cấp [thường là # Python2:
pip install click
# Python3:
pip3 install click
4], nó chỉ định phần mở rộng cho tệp sao lưu và tệp sao lưu vẫn còn xung quanh; Theo mặc định, phần mở rộng là Copying [my_source.cpp] to [my_target.cpp]
5 và nó bị xóa khi tệp đầu ra bị đóng. Lọc tại chỗ bị vô hiệu hóa khi đọc đầu vào tiêu chuẩn. if the keyword argument Copying [my_source.cpp] to [my_target.cpp]
Copying [my_source.cpp] to [my_target.cpp]
1 is passed to #!/usr/bin/python3
import argparse
arg_parser = argparse.ArgumentParser[ description = "Copy source_file as target_file." ]
arg_parser.add_argument[ "source_file" ]
arg_parser.add_argument[ "target_file" ]
arguments = arg_parser.parse_args[]
source = arguments.source_file
target = arguments.target_file
print[ "Copying [{}] to [{}]".format[source, target] ]
1 or to the # Python2:
pip install click
# Python3:
pip3 install click
5 constructor, the file is moved to a backup file and standard output is directed to the input file [if a file
of the same name as the backup file already exists, it will be replaced silently]. This makes it possible to write a filter that rewrites its input file in place. If the backup parameter is given [typically as Copying [my_source.cpp] to [my_target.cpp]
4], it specifies the extension for the backup file, and the backup file remains around; by default, the extension is Copying [my_source.cpp] to [my_target.cpp]
5 and it is deleted when the output file is closed. In-place filtering is disabled when standard input is read.Hai móc mở sau đây được cung cấp bởi mô -đun này:
fileInput.hook_compress [tên tệp, chế độ, *, mã hóa = không, lỗi = không] ¶hook_compressed[filename, mode, *, encoding=None, errors=None]¶Mở trong suốt các tệp được nén với GZIP và BZIP2 [được công nhận bởi các phần mở rộng
Copying [my_source.cpp] to [my_target.cpp]
6 và Copying [my_source.cpp] to [my_target.cpp]
7] bằng các mô -đun Copying [my_source.cpp] to [my_target.cpp]
8 và Copying [my_source.cpp] to [my_target.cpp]
9. Nếu tiện ích mở rộng tên tệp không phải là Copying [my_source.cpp] to [my_target.cpp]
6 hoặc Copying [my_source.cpp] to [my_target.cpp]
7, thì tệp được mở bình thường [nghĩa là sử dụng Usage: test.py [OPTIONS] FILENAME
Options:
--help Show this message and exit.
8 mà không cần giải nén].Các giá trị mã hóa và lỗi được truyền đến
import fileinput for line in fileinput.input[encoding="utf-8"]: process[line]3 cho các tệp được nén và mở cho các tệp thông thường.
Ví dụ sử dụng:
import fileinput for line in fileinput.input[encoding="utf-8"]: process[line]4
Đã thay đổi trong phiên bản 3.10: Mã hóa và lỗi tham số chỉ dành cho từ khóa được thêm vào.The keyword-only parameter encoding and errors are added.
Đã thay đổi trong phiên bản 3.11: chế độusage: .py [-h] source_file target_file
Copy source_file as target_file.
positional arguments:
source_file
target_file
optional arguments:
-h, --help show this help message and exit
8 và usage: .py [-h] source_file target_file
Copy source_file as target_file.
positional arguments:
source_file
target_file
optional arguments:
-h, --help show this help message and exit
9 và phương pháp Copying [my_source.cpp] to [my_target.cpp]
0 đã bị xóa.hook_encoded[encoding, errors=None]¶Lọc tại chỗ tùy chọn: Nếu đối số từ khóa
Copying [my_source.cpp] to [my_target.cpp]
1 được chuyển đến #!/usr/bin/python3
import argparse
arg_parser = argparse.ArgumentParser[ description = "Copy source_file as target_file." ]
arg_parser.add_argument[ "source_file" ]
arg_parser.add_argument[ "target_file" ]
arguments = arg_parser.parse_args[]
source = arguments.source_file
target = arguments.target_file
print[ "Copying [{}] to [{}]".format[source, target] ]
1 hoặc cho hàm tạo # Python2:
pip install click
# Python3:
pip3 install click
5, tệp được chuyển sang tệp sao lưu và đầu ra tiêu chuẩn được chuyển đến tệp đầu vào [nếu một tệp cùng tên với tệp sao lưu đã tồn tại, nó sẽ được thay thế âm thầm]. Điều này cho phép viết một bộ lọc viết lại tệp đầu vào của nó. Nếu tham số sao lưu được cung cấp [thường là Copying [my_source.cpp] to [my_target.cpp]
4], nó chỉ định phần mở rộng cho tệp sao lưu và tệp sao lưu vẫn còn xung quanh; Theo mặc định, phần mở rộng là Copying [my_source.cpp] to [my_target.cpp]
5 và nó bị xóa khi tệp đầu ra bị đóng. Lọc tại chỗ bị vô hiệu hóa khi đọc đầu vào tiêu chuẩn.Hai móc mở sau đây được cung cấp bởi mô -đun này:
fileInput.hook_compress [tên tệp, chế độ, *, mã hóa = không, lỗi = không] ¶Added the optional errors parameter.
Mở trong suốt các tệp được nén với GZIP và BZIP2 [được công nhận bởi các phần mở rộng
6 và Copying [my_source.cpp] to [my_target.cpp]
7] bằng các mô -đun Copying [my_source.cpp] to [my_target.cpp]
8 và Copying [my_source.cpp] to [my_target.cpp]
9. Nếu tiện ích mở rộng tên tệp không phải là Copying [my_source.cpp] to [my_target.cpp]
6 hoặc Copying [my_source.cpp] to [my_target.cpp]
7, thì tệp được mở bình thường [nghĩa là sử dụng Copying [my_source.cpp] to [my_target.cpp]
8 mà không cần giải nén].This function is deprecated since
Usage: test.py [OPTIONS] FILENAME
Options:
--help Show this message and exit.
#!/usr/bin/python3
import argparse
arg_parser = argparse.ArgumentParser[ description = "Copy source_file as target_file." ]
arg_parser.add_argument[ "source_file" ]
arg_parser.add_argument[ "target_file" ]
arguments = arg_parser.parse_args[]
source = arguments.source_file
target = arguments.target_file
print[ "Copying [{}] to [{}]".format[source, target] ]
1 and # Python2:
pip install click
# Python3:
pip3 install click
5 now have encoding and errors parameters.