最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python實(shí)現(xiàn)腳本轉(zhuǎn)換為命令行程序

 更新時(shí)間:2022年09月23日 14:45:46   作者:Mark?Meyer  
使用Python中的scaffold和click庫(kù),你可以將一個(gè)簡(jiǎn)單的實(shí)用程序升級(jí)為一個(gè)成熟的命令行界面工具,本文就來(lái)帶你看看具體實(shí)現(xiàn)方法,感興趣的可以了解下

在我的職業(yè)生涯中,我寫過(guò)、用過(guò)和看到過(guò)很多隨意的腳本。一些人需要半自動(dòng)化完成任務(wù),于是它們誕生了。一段時(shí)間后,它們變得越來(lái)越大。它們?cè)谝簧锌赡苻D(zhuǎn)手很多次。我常常希望這些腳本提供更多的 命令行工具式 的感覺(jué)。但是,從一次性腳本到合適的工具,真正提高質(zhì)量水平有多難呢?事實(shí)證明這在 Python 中并不難。

搭建骨架腳本

在本文中,我將從一小段 Python 代碼開(kāi)始。我將把它應(yīng)用到 ? ?scaffold? ?? 模塊中,并使用 ? ?click? ? 庫(kù)擴(kuò)展它以接受命令行參數(shù)。

#!/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()

本文所有沒(méi)有在這里插入顯示的代碼示例,你都可以在 ? ?https://codeberg.org/ofosos/rotoscope? ? 中找到特定版本的代碼。該倉(cāng)庫(kù)中的每個(gè)提交都描述了本文操作過(guò)程中一些有意義的步驟。

這個(gè)片段做了幾件事:

?INCOMING?
?ARCHIVE?
?ARCHIVE/latest.txt?

作為一個(gè)示例,它很簡(jiǎn)單,但它會(huì)讓你理解這個(gè)過(guò)程。

使用 Pyscaffold 創(chuàng)建應(yīng)用程序

首先,你需要安裝 ? ?scaffold? ??、? ?click? ?? 和 ? ?tox? ?? ? ?Python 庫(kù)? ?。

$ python3 -m pip install scaffold click tox

安裝 ? ?scaffold? ?? 后,切換到示例的 ? ?rotoscope? ? 項(xiàng)目所在的目錄,然后執(zhí)行以下命令:

$ putup rotoscope -p rotoscope \

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

Pyscaffold 會(huì)重寫我的 ? ?README.md? ?,所以從 Git 恢復(fù)它:

$ git checkout README.md

Pyscaffold 在文檔中說(shuō)明了如何設(shè)置一個(gè)完整的示例項(xiàng)目,我不會(huì)在這里介紹,你之后可以探索。除此之外,Pyscaffold 還可以在項(xiàng)目中為你提供持續(xù)集成(CI)模板:

  • 打包: 你的項(xiàng)目現(xiàn)在啟用了 PyPi,所以你可以將其上傳到一個(gè)倉(cāng)庫(kù)并從那里安裝它。
  • 文檔: 你的項(xiàng)目現(xiàn)在有了一個(gè)完整的文檔文件夾層次結(jié)構(gòu),它基于 Sphinx,包括一個(gè)? ?readthedocs.org? ? 構(gòu)建器。
  • 測(cè)試: 你的項(xiàng)目現(xiàn)在可以與 tox 一起使用,測(cè)試文件夾包含運(yùn)行基于 pytest 的測(cè)試所需的所有樣板文件。
  • 依賴管理: 打包和測(cè)試基礎(chǔ)結(jié)構(gòu)都需要一種管理依賴關(guān)系的方法。? ?setup.cfg? ? 文件解決了這個(gè)問(wèn)題,它包含所有依賴項(xiàng)。
  • 預(yù)提交鉤子: 包括 Python 源代碼格式工具 black 和 Python 風(fēng)格檢查器 flake8。

查看測(cè)試文件夾并在項(xiàng)目目錄中運(yùn)行 ? ?tox? ? 命令,它會(huì)立即輸出一個(gè)錯(cuò)誤:打包基礎(chǔ)設(shè)施無(wú)法找到相關(guān)庫(kù)。

現(xiàn)在創(chuàng)建一個(gè) ? ?Git? ?? 標(biāo)記(例如 ? ?v0.2? ??),此工具會(huì)將其識(shí)別為可安裝版本。在提交更改之前,瀏覽一下自動(dòng)生成的 ? ?setup.cfg? ?? 并根據(jù)需要編輯它。對(duì)于此示例,你可以修改 ? ?LICENSE? ? 和項(xiàng)目描述,將這些更改添加到 Git 的暫存區(qū),我必須禁用預(yù)提交鉤子,然后提交它們。否則,我會(huì)遇到錯(cuò)誤,因?yàn)?Python 風(fēng)格檢查器 flake8 會(huì)抱怨糟糕的格式。

$ PRE_COMMIT_ALLOW_NO_CONFIG=1 git commit

如果這個(gè)腳本有一個(gè)入口點(diǎn),用戶可以從命令行調(diào)用,那就更好了?,F(xiàn)在,你只能通過(guò)找 ? ?.py? ?? 文件并手動(dòng)執(zhí)行它來(lái)運(yùn)行。幸運(yùn)的是,Python 的打包基礎(chǔ)設(shè)施有一個(gè)很好的“罐裝”方式,可以輕松地進(jìn)行配置更改。將以下內(nèi)容添加到 ? ?setup.cfg? ?? 的 ? ?options.entry_points? ? 部分:

console_scripts =
    roto = rotoscope.rotoscope:rotoscope

這個(gè)更改會(huì)創(chuàng)建一個(gè)名為 ? ?roto? ?? 的 shell 命令,你可以使用它來(lái)調(diào)用 rotoscope 腳本,使用 ? ?pip? ?? 安裝 rotoscope 后,可以使用 ? ?roto? ? 命令。

就是這樣,你可以從 Pyscaffold 免費(fèi)獲得所有打包、測(cè)試和文檔設(shè)置。你還獲得了一個(gè)預(yù)提交鉤子來(lái)保證(大部分情況下)你按照設(shè)定規(guī)則提交。

CLI 工具化

現(xiàn)在,一些值會(huì)硬編碼到腳本中,它們作為命令 ? ?參數(shù)? ?? 會(huì)更方便。例如,將 ? ?INCOMING? ? 常量作為命令行參數(shù)會(huì)更好。

首先,導(dǎo)入 ? ?click? ?? 庫(kù),使用 Click 提供的命令裝飾器對(duì) ? ?rotoscope()? ?? 方法進(jìn)行裝飾,并添加一個(gè) Click 傳遞給 ? ?rotoscope? ? 函數(shù)的參數(shù)。Click 提供了一組驗(yàn)證器,因此要向參數(shù)添加一個(gè)路徑驗(yàn)證器。Click 還方便地使用函數(shù)的內(nèi)嵌字符串作為命令行文檔的一部分。所以你最終會(huì)得到以下方法簽名:

@click.command()
@click.argument('incoming', type=click.Path(exists=True))
def rotoscope(incoming):

    """

    Rotoscope 0.4 - Bleep, blooop.

    Simple sample that move files.

    """

主函數(shù)會(huì)調(diào)用 ? ?rotoscope()? ?,它現(xiàn)在是一個(gè) Click 命令,不需要傳遞任何參數(shù)。

選項(xiàng)也可以使用 ? ?環(huán)境變量? ?? 自動(dòng)填充。例如,將 ? ?ARCHIVE? ? 常量改為一個(gè)選項(xiàng):

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

使用相同的路徑驗(yàn)證器。這一次,讓 Click 填充環(huán)境變量,如果環(huán)境變量沒(méi)有提供任何內(nèi)容,則默認(rèn)為舊常量的值。

Click 可以做更多的事情,它有彩色的控制臺(tái)輸出、提示和子命令,可以讓你構(gòu)建復(fù)雜的 CLI 工具。瀏覽 Click 文檔會(huì)發(fā)現(xiàn)它的更多功能。

現(xiàn)在添加一些測(cè)試。

測(cè)試

Click 對(duì)使用 CLI 運(yùn)行器 ? ?運(yùn)行端到端測(cè)試? ?? 提供了一些建議。你可以用它來(lái)實(shí)現(xiàn)一個(gè)完整的測(cè)試(在 ? ?示例項(xiàng)目? ?? 中,測(cè)試在 ? ?tests? ? 文件夾中。)

測(cè)試位于測(cè)試類的一個(gè)方法中。大多數(shù)約定與我在其他 Python 項(xiàng)目中使用的非常接近,但有一些細(xì)節(jié),因?yàn)?rotoscope 使用 ? ?click? ??。在 ? ?test? ?? 方法中,我創(chuàng)建了一個(gè) ? ?CliRunner? ??。測(cè)試使用它在一個(gè)隔離的文件系統(tǒng)中運(yùn)行此命令。然后測(cè)試在隔離的文件系統(tǒng)中創(chuàng)建 ? ?incoming? ?? 和 ? ?archive? ?? 目錄和一個(gè)虛擬的 ? ?incoming/test.txt? ?? 文件,然后它調(diào)用 CliRunner,就像你調(diào)用命令行應(yīng)用程序一樣。運(yùn)行完成后,測(cè)試會(huì)檢查隔離的文件系統(tǒng),并驗(yàn)證 ? ?incoming? ?? 為空,并且 ? ?archive? ? 包含兩個(gè)文件(最新鏈接和存檔文件)。

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

要在控制臺(tái)上執(zhí)行這些測(cè)試,在項(xiàng)目的根目錄中運(yùn)行 ? ?tox? ?。

在執(zhí)行測(cè)試期間,我在代碼中發(fā)現(xiàn)了一個(gè)錯(cuò)誤。當(dāng)我進(jìn)行 Click 轉(zhuǎn)換時(shí),? ?rotoscope? ? 只是取消了最新文件的鏈接,無(wú)論它是否存在。測(cè)試從一個(gè)新的文件系統(tǒng)(不是我的主文件夾)開(kāi)始,很快就失敗了。我可以通過(guò)在一個(gè)很好的隔離和自動(dòng)化測(cè)試環(huán)境中運(yùn)行來(lái)防止這種錯(cuò)誤。這將避免很多“它在我的機(jī)器上正常工作”的問(wèn)題。

搭建骨架腳本和模塊

我們可以使用 ? ?scaffold? ?? 和 ? ?click? ? 完成一些高級(jí)操作。有很多方法可以升級(jí)一個(gè)普通的 Python 腳本,甚至可以將你的簡(jiǎn)單實(shí)用程序變成成熟的 CLI 工具。

以上就是Python實(shí)現(xiàn)腳本轉(zhuǎn)換為命令行程序的詳細(xì)內(nèi)容,更多關(guān)于Python腳本轉(zhuǎn)命令行的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 基于OpenCV的攝像頭測(cè)距的實(shí)現(xiàn)示例

    基于OpenCV的攝像頭測(cè)距的實(shí)現(xiàn)示例

    本文主要介紹了基于OpenCV的攝像頭測(cè)距的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • python簡(jiǎn)單實(shí)現(xiàn)AES加密和解密

    python簡(jiǎn)單實(shí)現(xiàn)AES加密和解密

    這篇文章主要為大家詳細(xì)介紹了python簡(jiǎn)單實(shí)現(xiàn)AES加密和解密,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • python中閉包Closure函數(shù)作為返回值的方法示例

    python中閉包Closure函數(shù)作為返回值的方法示例

    閉包(closure)是函數(shù)式編程的重要的語(yǔ)法結(jié)構(gòu),Python也支持這一特性,下面這篇文章主要給大家介紹了關(guān)于python中閉包Closure函數(shù)作為返回值的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。
    2017-12-12
  • pandas中刪除列的幾種方法

    pandas中刪除列的幾種方法

    在pandas中有多種方法可以刪除列,本文主要介紹了pandas中刪除列的幾種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07
  • python基礎(chǔ)之包的導(dǎo)入和__init__.py的介紹

    python基礎(chǔ)之包的導(dǎo)入和__init__.py的介紹

    這篇文章主要介紹了python基礎(chǔ)之包的導(dǎo)入和__init__.py的相關(guān)資料,需要的朋友可以參考下
    2018-01-01
  • Pygame?精準(zhǔn)檢測(cè)圖像碰撞的問(wèn)題

    Pygame?精準(zhǔn)檢測(cè)圖像碰撞的問(wèn)題

    這篇文章主要介紹了Pygame?精準(zhǔn)檢測(cè)圖像碰撞,在用Pygame寫游戲的時(shí)候,有人可能會(huì)遇到兩個(gè)Rect對(duì)象碰撞但是對(duì)象之間還有空間間隔的問(wèn)題,這里,將教大家用一種方法精準(zhǔn)地檢測(cè)圖像碰撞,需要的朋友可以參考下
    2022-06-06
  • Python Matplotlib數(shù)據(jù)可視化模塊使用詳解

    Python Matplotlib數(shù)據(jù)可視化模塊使用詳解

    matplotlib是基建立在python之上,適用于創(chuàng)建靜態(tài),動(dòng)畫和交互式可視化,通常與數(shù)據(jù)分析模塊pandas搭配使用,用于數(shù)據(jù)的分析和展示,適用于主流的操作系統(tǒng),如Linux、Win、Mac
    2022-11-11
  • python3處理word文檔實(shí)例分析

    python3處理word文檔實(shí)例分析

    在本篇文章里小編給大家分享了一篇關(guān)于python3處理word文檔實(shí)例分析內(nèi)容,有興趣的朋友們可以參考下。
    2020-12-12
  • vscode+PyQt5安裝詳解步驟

    vscode+PyQt5安裝詳解步驟

    這篇文章主要介紹了vscode+PyQt5安裝詳解步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 簡(jiǎn)單了解Django ORM常用字段類型及參數(shù)配置

    簡(jiǎn)單了解Django ORM常用字段類型及參數(shù)配置

    這篇文章主要介紹了簡(jiǎn)單了解Django ORM常用字段類型及參數(shù)配置,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01

最新評(píng)論

华亭县| 邯郸市| 乌拉特中旗| 阳山县| 句容市| 博爱县| 怀来县| 商都县| 沁水县| 贡山| 梨树县| 那曲县| 旬阳县| 东阿县| 桂林市| 定州市| 安岳县| 漳浦县| 张北县| 美姑县| 工布江达县| 云浮市| 祁门县| 民和| 榆中县| 孟州市| 华亭县| 屏南县| 靖远县| 濉溪县| 宾川县| 阜平县| 宁津县| 江阴市| 鹤峰县| 乌兰浩特市| 六枝特区| 南通市| 商丘市| 建平县| 沅陵县|