Làm cách nào để chạy ứng dụng bảng điều khiển python?

Với giàn giáo và nhấp chuột trong Python, bạn có thể nâng cấp ngay cả một tiện ích đơn giản thành một công cụ giao diện dòng lệnh chính thức

Qua

Mark Meyer

Ngày 19 tháng 7 năm 2022 . . %t phút đọc

Đăng ký hoặc Đăng nhập để thích

Hình ảnh của

Mã nguồn mở. com

Tôi đã viết, sử dụng và thấy rất nhiều kịch bản lỏng lẻo trong sự nghiệp của mình. Họ bắt đầu với ai đó cần bán tự động hóa một số nhiệm vụ. Sau một thời gian, chúng phát triển. Họ có thể đổi chủ nhiều lần trong đời. Tôi thường mong muốn có cảm giác giống như công cụ dòng lệnh hơn trong các tập lệnh đó. Nhưng thực sự khó đến mức nào để nâng mức chất lượng từ một tập lệnh dùng một lần lên một công cụ phù hợp?

Đoạn đầu đài

Trong bài viết này, tôi bắt đầu với một đoạn mã Python nhỏ. Tôi sẽ thả nó vào một mô-đun scaffold và mở rộng nó bằng

$ python3 -m pip install scaffold click tox
0 để chấp nhận các đối số dòng lệnh

#!/usr/bin/python

from glob import glob
from os.path import join, basename
from shutil import move
from datetime import datetime
from os import link, unlink

LATEST = 'latest.txt'
ARCHIVE = '/Users/mark/archive'
INCOMING = '/Users/mark/incoming'
TPATTERN = '%Y-%m-%d'

def transmogrify_filename[fname]:
    bname = basename[fname]
    ts = datetime.now[].strftime[TPATTERN]
    return '-'.join[[ts, bname]]

def set_current_latest[file]:
    latest = join[ARCHIVE, LATEST]
    try:
        unlink[latest]
    except:
        pass
    link[file, latest]

def rotate_file[source]:
    target = join[ARCHIVE, transmogrify_filename[source]]
    move[source, target]
    set_current_latest[target]

def rotoscope[]:
    file_no = 0
    folder = join[INCOMING, '*.txt']
    print[f'Looking in {INCOMING}']
    for file in glob[folder]:
        rotate_file[file]
        print[f'Rotated: {file}']
        file_no = file_no + 1
    print[f'Total files rotated: {file_no}']

if __name__ == '__main__':
    print['This is rotoscope 0.4.1. Bleep, bloop.']
    rotoscope[]

Thêm tài nguyên Python

IDE là gì?

bảng ăn gian. Trăn 3. 7 cho người mới bắt đầu

Khung GUI Python hàng đầu

Tải xuống. 7 thư viện PyPI thiết yếu

Nhà phát triển mũ đỏ

Bài viết Python mới nhất

Tất cả các mẫu mã không nội tuyến trong bài viết này đề cập đến một phiên bản mã cụ thể mà bạn có thể tìm thấy tại https. // codeberg. org/ofosos/máy quay. Mỗi cam kết trong repo đó mô tả một số bước có ý nghĩa trong quá trình viết bài hướng dẫn này

Đoạn mã này thực hiện một vài điều

  • Kiểm tra xem có bất kỳ tệp văn bản nào trong đường dẫn được chỉ định trong
    $ python3 -m pip install scaffold click tox
    1 không
  • Nếu nó tồn tại, nó sẽ tạo một tên tệp mới với dấu thời gian hiện tại và di chuyển tệp tới
    $ python3 -m pip install scaffold click tox
    2
  • Xóa liên kết
    $ python3 -m pip install scaffold click tox
    3 hiện tại và tạo liên kết mới trỏ đến tệp vừa thêm

Ví dụ, cái này khá nhỏ, nhưng nó cho bạn ý tưởng về quy trình

Tạo một ứng dụng với pyscaffold

Trước tiên, bạn cần cài đặt các mô-đun Python scaffold,

$ python3 -m pip install scaffold click tox
0 và
$ python3 -m pip install scaffold click tox
6

$ python3 -m pip install scaffold click tox

Sau khi cài đặt scaffold, thay đổi thư mục chứa dự án ví dụ

$ python3 -m pip install scaffold click tox
8, rồi thực hiện lệnh sau

$ putup rotoscope -p rotoscope \
--force --no-skeleton -n rotoscope \
-d 'Move some files around.' -l GLWT \
-u //codeberg.org/ofosos/rotoscope \
--save-config --pre-commit --markdown

Pyscaffold đã ghi đè lên

$ python3 -m pip install scaffold click tox
9 của tôi, vì vậy hãy khôi phục nó từ Git

$ git checkout README.md

Pyscaffold đã thiết lập một dự án mẫu hoàn chỉnh trong hệ thống phân cấp tài liệu mà tôi sẽ không đề cập ở đây nhưng bạn có thể khám phá nó sau. Bên cạnh đó, Pyscaffold cũng có thể cung cấp cho bạn các mẫu tích hợp liên tục [CI] trong dự án của bạn

  • đóng gói. Dự án của bạn hiện đã được kích hoạt PyPi, vì vậy bạn có thể tải nó lên một kho lưu trữ và cài đặt nó từ đó
  • tài liệu. Dự án của bạn hiện có một hệ thống phân cấp thư mục tài liệu hoàn chỉnh, dựa trên Sphinx và bao gồm một tệp readthedocs. người xây dựng tổ chức
  • thử nghiệm. Dự án của bạn hiện có thể được sử dụng với trình chạy thử nghiệm tox và thư mục thử nghiệm chứa tất cả các bản soạn sẵn cần thiết để chạy thử nghiệm dựa trên pytest
  • quản lý phụ thuộc. Cả cơ sở hạ tầng đóng gói và thử nghiệm đều cần một cách để quản lý các phụ thuộc. Tệp
    $ putup rotoscope -p rotoscope \
    --force --no-skeleton -n rotoscope \
    -d 'Move some files around.' -l GLWT \
    -u //codeberg.org/ofosos/rotoscope \
    --save-config --pre-commit --markdown
    
    0 giải quyết vấn đề này và bao gồm các phụ thuộc
  • móc trước cam kết. Điều này bao gồm trình định dạng nguồn Python "black" và trình kiểm tra kiểu Python "flake8"

Hãy xem thư mục tests và chạy lệnh

$ python3 -m pip install scaffold click tox
6 trong thư mục dự án. Nó báo lỗi ngay. Cơ sở hạ tầng đóng gói không thể tìm thấy gói hàng của bạn

Bây giờ hãy tạo thẻ Git [ví dụ:

$ putup rotoscope -p rotoscope \
--force --no-skeleton -n rotoscope \
-d 'Move some files around.' -l GLWT \
-u //codeberg.org/ofosos/rotoscope \
--save-config --pre-commit --markdown
2] mà công cụ nhận dạng là phiên bản có thể cài đặt. Trước khi thực hiện các thay đổi, hãy xem qua
$ putup rotoscope -p rotoscope \
--force --no-skeleton -n rotoscope \
-d 'Move some files around.' -l GLWT \
-u //codeberg.org/ofosos/rotoscope \
--save-config --pre-commit --markdown
0 được tạo tự động và chỉnh sửa nó cho phù hợp với trường hợp sử dụng của bạn. Đối với ví dụ này, bạn có thể điều chỉnh
$ putup rotoscope -p rotoscope \
--force --no-skeleton -n rotoscope \
-d 'Move some files around.' -l GLWT \
-u //codeberg.org/ofosos/rotoscope \
--save-config --pre-commit --markdown
4 và các mô tả dự án. Thêm những thay đổi đó vào khu vực tổ chức của Git, tôi phải cam kết chúng với hook pre-commit bị vô hiệu hóa. Mặt khác, tôi sẽ gặp lỗi vì flake8, trình kiểm tra kiểu Python, phàn nàn về kiểu tệ hại

$ PRE_COMMIT_ALLOW_NO_CONFIG=1 git commit 

Sẽ thật tuyệt nếu có một điểm vào tập lệnh này mà người dùng có thể gọi từ dòng lệnh. Ngay bây giờ, bạn chỉ có thể chạy nó bằng cách tìm tệp

$ putup rotoscope -p rotoscope \
--force --no-skeleton -n rotoscope \
-d 'Move some files around.' -l GLWT \
-u //codeberg.org/ofosos/rotoscope \
--save-config --pre-commit --markdown
5 và thực hiện thủ công. May mắn thay, cơ sở hạ tầng đóng gói của Python có một cách "đóng hộp" tốt để thực hiện thay đổi cấu hình dễ dàng này. Thêm phần sau vào phần
$ putup rotoscope -p rotoscope \
--force --no-skeleton -n rotoscope \
-d 'Move some files around.' -l GLWT \
-u //codeberg.org/ofosos/rotoscope \
--save-config --pre-commit --markdown
6 của
$ putup rotoscope -p rotoscope \
--force --no-skeleton -n rotoscope \
-d 'Move some files around.' -l GLWT \
-u //codeberg.org/ofosos/rotoscope \
--save-config --pre-commit --markdown
0 của bạn

console_scripts =
    roto = rotoscope.rotoscope:rotoscope

Thay đổi này tạo ra một lệnh trình bao có tên là

$ putup rotoscope -p rotoscope \
--force --no-skeleton -n rotoscope \
-d 'Move some files around.' -l GLWT \
-u //codeberg.org/ofosos/rotoscope \
--save-config --pre-commit --markdown
8, bạn có thể sử dụng lệnh này để gọi tập lệnh rotoscope. Khi bạn cài đặt rotoscope với
$ putup rotoscope -p rotoscope \
--force --no-skeleton -n rotoscope \
-d 'Move some files around.' -l GLWT \
-u //codeberg.org/ofosos/rotoscope \
--save-config --pre-commit --markdown
9, bạn có thể sử dụng lệnh
$ putup rotoscope -p rotoscope \
--force --no-skeleton -n rotoscope \
-d 'Move some files around.' -l GLWT \
-u //codeberg.org/ofosos/rotoscope \
--save-config --pre-commit --markdown
8

đó là. Bạn có tất cả thiết lập đóng gói, thử nghiệm và tài liệu miễn phí từ Pyscaffold. Bạn cũng có một móc nối trước để giữ cho bạn [hầu hết] trung thực

công cụ CLI

Ngay bây giờ, có những giá trị được mã hóa cứng vào tập lệnh sẽ thuận tiện hơn dưới dạng lệnh. Chẳng hạn, hằng số

$ python3 -m pip install scaffold click tox
1 sẽ tốt hơn khi là một tham số dòng lệnh

Đầu tiên, nhập thư viện nhấp chuột. Chú thích phương thức

$ git checkout README.md
2 bằng chú thích lệnh do Click cung cấp và thêm một đối số mà Click chuyển đến hàm
$ python3 -m pip install scaffold click tox
8. Nhấp chuột cung cấp một bộ trình xác thực, vì vậy hãy thêm trình xác thực đường dẫn vào đối số. Click cũng thuận tiện sử dụng chuỗi tại đây của hàm như một phần của tài liệu dòng lệnh. Vì vậy, bạn kết thúc với chữ ký phương thức sau

@click.command[]
@click.argument['incoming', type=click.Path[exists=True]]
def rotoscope[incoming]:
    """
    Rotoscope 0.4 - Bleep, blooop.
    Simple sample that move files.
    """

Phần chính gọi

$ git checkout README.md
2, hiện là lệnh Nhấp chuột. Nó không cần truyền bất kỳ tham số nào

Các tùy chọn cũng có thể được điền tự động bởi các biến môi trường. Chẳng hạn, thay đổi hằng số

$ python3 -m pip install scaffold click tox
2 thành một tùy chọn

@click.option['archive', '--archive', default='/Users/mark/archive', envvar='ROTO_ARCHIVE', type=click.Path[]]

Trình xác thực đường dẫn tương tự được áp dụng lại. Lần này, hãy để Click điền vào biến môi trường, mặc định là giá trị của hằng số cũ nếu môi trường không cung cấp gì

Nhấp chuột có thể làm nhiều thứ hơn nữa. Nó có đầu ra bảng điều khiển màu, lời nhắc và tiểu ban cho phép bạn xây dựng các công cụ CLI phức tạp. Duyệt qua tài liệu về Nhấp chuột sẽ tiết lộ thêm sức mạnh của nó

Bây giờ thêm một số thử nghiệm vào hỗn hợp

thử nghiệm

Click có một số lời khuyên về việc chạy thử nghiệm từ đầu đến cuối bằng trình chạy CLI. Bạn có thể sử dụng điều này để thực hiện một bài kiểm tra hoàn chỉnh [trong dự án mẫu, các bài kiểm tra nằm trong thư mục

$ git checkout README.md
6. ]

Bài kiểm tra nằm trong một phương thức của lớp kiểm tra. Hầu hết các quy ước tuân theo rất chặt chẽ những gì tôi sẽ sử dụng trong bất kỳ dự án Python nào khác, nhưng có một số chi tiết cụ thể vì kính quay sử dụng

$ python3 -m pip install scaffold click tox
0. Trong phương pháp
$ git checkout README.md
8, tôi tạo một
$ git checkout README.md
9. Thử nghiệm sử dụng điều này để chạy lệnh trong một hệ thống tệp bị cô lập. Sau đó, thử nghiệm tạo các thư mục
$ PRE_COMMIT_ALLOW_NO_CONFIG=1 git commit 
0 và
$ PRE_COMMIT_ALLOW_NO_CONFIG=1 git commit 
1 và một tệp
$ PRE_COMMIT_ALLOW_NO_CONFIG=1 git commit 
2 giả trong hệ thống tệp bị cô lập. Sau đó, nó gọi CliRunner giống như bạn gọi một ứng dụng dòng lệnh. Sau khi quá trình chạy hoàn tất, thử nghiệm sẽ kiểm tra hệ thống tệp bị cô lập và xác minh rằng
$ PRE_COMMIT_ALLOW_NO_CONFIG=1 git commit 
0 trống và
$ PRE_COMMIT_ALLOW_NO_CONFIG=1 git commit 
1 chứa hai tệp [liên kết mới nhất và tệp lưu trữ. ]

from os import listdir, mkdir
from click.testing import CliRunner
from rotoscope.rotoscope import rotoscope

class TestRotoscope:
    def test_roto_good[self, tmp_path]:
        runner = CliRunner[]

        with runner.isolated_filesystem[temp_dir=tmp_path] as td:
            mkdir["incoming"]
            mkdir["archive"]
            with open["incoming/test.txt", "w"] as f:
                f.write["hello"]

            result = runner.invoke[rotoscope, ["incoming", "--archive", "archive"]]
            assert result.exit_code == 0

            print[td]
            incoming_f = listdir["incoming"]
            archive_f = listdir["archive"]
            assert len[incoming_f] == 0
            assert len[archive_f] == 2

Để thực hiện các thử nghiệm này trên bảng điều khiển của tôi, hãy chạy

$ python3 -m pip install scaffold click tox
6 trong thư mục gốc của dự án

Trong quá trình thực hiện các bài kiểm tra, tôi đã tìm thấy một lỗi trong mã của mình. Khi tôi thực hiện chuyển đổi Nhấp chuột, rotoscope chỉ hủy liên kết tệp mới nhất, cho dù tệp đó có tồn tại hay không. Các thử nghiệm bắt đầu với một hệ thống tệp mới [không phải thư mục nhà của tôi] và nhanh chóng thất bại. Tôi có thể ngăn chặn loại lỗi này bằng cách chạy trong một môi trường thử nghiệm tự động và biệt lập. Điều đó sẽ tránh được rất nhiều vấn đề "nó hoạt động trên máy của tôi"

Giàn giáo và mô-đun

Điều này hoàn thành chuyến tham quan của chúng tôi về những điều nâng cao mà bạn có thể làm với scaffold

$ python3 -m pip install scaffold click tox
0. Có nhiều khả năng để nâng cấp một tập lệnh Python thông thường và thậm chí biến các tiện ích đơn giản của bạn thành các công cụ CLI chính thức

$ PRE_COMMIT_ALLOW_NO_CONFIG=1 git commit 
8

Đọc gì tiếp theo

Thẻ

con trăn

lập trình

Mark Meyer

Mark là kiến ​​trúc sư CNTT cho MaibornWolff ở Hamburg, Đức, làm việc trong bộ phận DevOps và Cloud Native. Tại nơi làm việc, anh ấy cố gắng đóng góp lại cho nguồn mở bất cứ khi nào có thể. Anh ấy cũng phù hợp với một số công việc nguồn mở, khi không phải làm công việc hàng ngày của mình. Trong số những thứ khác, anh ấy quan tâm đến tài liệu và quy trình làm việc của tài liệu. Mark là giám khảo bia được BJCP Certified và sở hữu một chiếc máy ảnh

Chủ Đề