精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

將你的 Python 腳本轉換為命令行程序

開發 后端
使用 Python 中的 scaffold 和 click 庫,你可以將一個簡單的實用程序升級為一個成熟的命令行界面工具

在我的職業生涯中,我寫過、用過和看到過很多隨意的腳本。一些人需要半自動化完成任務,于是它們誕生了。一段時間后,它們變得越來越大。它們在一生中可能轉手很多次。我常常希望這些腳本提供更多的命令行工具式的感覺。但是,從一次性腳本到合適的工具,真正提高質量水平有多難呢?事實證明這在 Python 中并不難。

搭建骨架腳本

在本文中,我將從一小段 Python 代碼開始。我將把它應用到 ??scaffold??? 模塊中,并使用 ??click?? 庫擴展它以接受命令行參數。

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

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

這個片段做了幾件事:

  • 檢查??INCOMING?? 指定的路徑中是否有文本文件
  • 如果存在,則使用當前時間戳創建一個新文件名,并將其移動到??ARCHIVE??
  • 刪除當前的??ARCHIVE/latest.txt?? 鏈接,并創建一個指向剛剛添加文件的新鏈接

作為一個示例,它很簡單,但它會讓你理解這個過程。

使用 Pyscaffold 創建應用程序

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

$ python3 -m pip install scaffold click tox

安裝 ??scaffold??? 后,切換到示例的 ??rotoscope?? 項目所在的目錄,然后執行以下命令:

$ 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 會重寫我的 ??README.md??,所以從 Git 恢復它:

$ git checkout README.md

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

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

查看測試文件夾并在項目目錄中運行 ??tox?? 命令,它會立即輸出一個錯誤:打包基礎設施無法找到相關庫。

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

$ PRE_COMMIT_ALLOW_NO_CONFIG=1 git commit

如果這個腳本有一個入口點,用戶可以從命令行調用,那就更好了。現在,你只能通過找 ??.py??? 文件并手動執行它來運行。幸運的是,Python 的打包基礎設施有一個很好的“罐裝”方式,可以輕松地進行配置更改。將以下內容添加到 ??setup.cfg??? 的 ??options.entry_points?? 部分:

console_scripts =

roto = rotoscope.rotoscope:rotoscope

這個更改會創建一個名為 ??roto??? 的 shell 命令,你可以使用它來調用 rotoscope 腳本,使用 ??pip??? 安裝 rotoscope 后,可以使用 ??roto?? 命令。

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

CLI 工具化

現在,一些值會硬編碼到腳本中,它們作為命令 ??參數??? 會更方便。例如,將 ??INCOMING?? 常量作為命令行參數會更好。

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

@click.command()

@click.argument('incoming', type=click.Path(exists=True))

def rotoscope(incoming):

"""

Rotoscope 0.4 - Bleep, blooop.

Simple sample that move files.

"""

主函數會調用 ??rotoscope()??,它現在是一個 Click 命令,不需要傳遞任何參數。

選項也可以使用 ??環境變量??? 自動填充。例如,將 ??ARCHIVE?? 常量改為一個選項:

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

使用相同的路徑驗證器。這一次,讓 Click 填充環境變量,如果環境變量沒有提供任何內容,則默認為舊常量的值。

Click 可以做更多的事情,它有彩色的控制臺輸出、提示和子命令,可以讓你構建復雜的 CLI 工具。瀏覽 Click 文檔會發現它的更多功能。

現在添加一些測試。

測試

Click 對使用 CLI 運行器 ??運行端到端測試??? 提供了一些建議。你可以用它來實現一個完整的測試(在 ??示例項目??? 中,測試在 ??tests?? 文件夾中。)

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

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

要在控制臺上執行這些測試,在項目的根目錄中運行 ??tox??。

在執行測試期間,我在代碼中發現了一個錯誤。當我進行 Click 轉換時,??rotoscope?? 只是取消了最新文件的鏈接,無論它是否存在。測試從一個新的文件系統(不是我的主文件夾)開始,很快就失敗了。我可以通過在一個很好的隔離和自動化測試環境中運行來防止這種錯誤。這將避免很多“它在我的機器上正常工作”的問題。

搭建骨架腳本和模塊

本文到此結束,我們可以使用 ??scaffold??? 和 ??click?? 完成一些高級操作。有很多方法可以升級一個普通的 Python 腳本,甚至可以將你的簡單實用程序變成成熟的 CLI 工具。

責任編輯:龐桂玉 來源: Linux中國
相關推薦

2023-03-31 08:44:55

Go開發命令

2019-04-16 06:50:34

2016-03-28 10:00:09

Swift命令程序

2010-07-15 10:58:23

Perl命令行程序

2022-09-27 13:07:41

clickPython命令行

2015-07-15 10:32:44

Node.js命令行程序

2025-08-26 03:00:00

2020-02-13 10:57:59

Python數據設計

2022-05-11 17:21:05

Btrfs文件系統Fedora

2010-03-26 14:49:04

Python腳本

2015-07-01 09:15:46

linuxQuora命令行

2009-05-30 09:26:38

AndroidGoogle移動OS

2010-03-10 17:23:37

Python 命令行參

2011-07-21 13:10:59

2009-07-14 14:03:56

Swing程序

2014-06-17 10:02:58

Bash Getopt命令行

2010-03-24 14:14:42

Python GUI

2020-10-15 17:55:37

Linux命令行大小寫轉換

2020-12-11 06:44:16

命令行工具開發

2020-12-10 16:16:08

工具代碼開發
點贊
收藏

51CTO技術棧公眾號

精品伦精品一区二区三区视频| 在线午夜精品自拍| 欧美一级片免费播放| 懂色av成人一区二区三区| 黄色综合网站| 亚洲二区中文字幕| av天堂永久资源网| 国产51人人成人人人人爽色哟哟| 日本怡春院一区二区| 亚洲精品一区二区在线| 人妻无码视频一区二区三区| bbbbbbbbbbb在线视频| 久久99久久99| 久久久久久69| mm131美女视频| 欧洲美女精品免费观看视频| 亚洲精品午夜久久久| 国产乱码精品一区二区三区日韩精品 | 激情视频在线观看免费| 青青草伊人久久| 在线观看国产精品91| 网站在线你懂的| 国产理论在线| 国产精品国产三级国产a| 成人av资源| 午夜精品一区二| 综合一区在线| 亚洲色图色老头| 国产欧美一区二| 国产粉嫩在线观看| 亚洲欧洲日本在线| 裸体丰满少妇做受久久99精品 | 欧美性色黄大片手机版| 国产午夜精品视频一区二区三区| 天堂av在线资源| 久久超碰97人人做人人爱| 97人洗澡人人免费公开视频碰碰碰| 亚洲第一综合网| 成午夜精品一区二区三区软件| 欧美色图一区二区三区| 久久久亚洲国产精品| 日本不卡三区| 国产日产欧美一区二区视频| 国产在线不卡精品| 天天操夜夜操视频| 国产精品草草| 中文字幕亚洲一区| 亚洲色图欧美另类| 国产一区二区三区国产精品| 一本大道久久精品懂色aⅴ| 中文字幕中文字幕在线中一区高清| 污污视频在线免费看| 国产一区在线视频| 国产精品久久中文| 久久国产精品系列| 欧美激情1区| 久久精品久久久久| 亚洲一区二区自偷自拍| 色爱综合av| 亚洲丁香久久久| 超碰人人cao| 国产精品久一| 欧美日韩国产综合一区二区三区 | www.88av| 一区二区网站| 日韩一区二区三区在线| 国产精欧美一区二区三区白种人| 免费观看亚洲| 黄网动漫久久久| 97久久国产亚洲精品超碰热| 久久77777| 中文字幕一区av| 亚洲一区二区三区涩| 二人午夜免费观看在线视频| 91社区在线播放| 免费在线成人av| 欧美成人免费| 国产 日韩 欧美大片| 不卡视频一区二区| 亚洲男人第一天堂| 成人妖精视频yjsp地址| 成人午夜电影在线播放| 黄色成人一级片| 99久久伊人网影院| 欧美日韩国产一二| 欧美色图另类| 久久久不卡网国产精品二区| 国产精品中文字幕在线| 国产成人免费看| 三级欧美韩日大片在线看| 日韩美女福利视频| 五月激情丁香网| 看国产成人h片视频| 国产一区玩具在线观看| 亚洲爆乳无码一区二区三区| 成人在线视频首页| 欧美不卡三区| 日韩理伦片在线| 亚洲精品视频观看| 国内自拍在线观看| 欧美电影免费看| 在线成人小视频| 男女性杂交内射妇女bbwxz| 天堂俺去俺来也www久久婷婷| 国产视频一区在线| 中文字幕在线观看二区| 牛牛国产精品| 8090成年在线看片午夜| 久久久午夜影院| 蜜臀久久久99精品久久久久久| 91免费人成网站在线观看18| 丰满少妇高潮在线观看| 久久久精品蜜桃| 久久久成人精品一区二区三区| 中文字幕在线观看网站| 欧美性极品xxxx做受| 日本黄色的视频| 欧美国产不卡| 日韩一区二区在线视频| 日操夜操天天操| 六月丁香婷婷久久| 99在线高清视频在线播放| 久久视频www| 一区二区三区中文字幕精品精品| 日韩免费一级视频| 成人在线啊v| 亚洲欧美福利视频| 黄色一级片在线| 免费视频最近日韩| 精品无人乱码一区二区三区的优势| 在线观看的av| 精品欧美国产一区二区三区| 性生生活大片免费看视频| 亚洲伊人春色| 欧美精品成人91久久久久久久| 中文字幕第四页| 国产91精品一区二区麻豆亚洲| 日本公妇乱淫免费视频一区三区| 色在线视频网| 7878成人国产在线观看| 国产毛片久久久久久久| 欧美日韩一卡| 国产欧美精品一区二区| 久久久资源网| 黄网动漫久久久| 蜜臀aⅴ国产精品久久久国产老师| 色小子综合网| 国产成人jvid在线播放| 日批视频免费播放| 一区二区成人在线观看| 91高清国产视频| 精品国产美女| 国产精品h片在线播放| 黄色片网站免费在线观看| 国产精品久久久久久妇女6080 | 99在线精品视频在线观看| 91精品一区二区| 日本最新在线视频| 欧美性色aⅴ视频一区日韩精品| 亚洲av无码国产精品久久| 精品动漫3d一区二区三区免费版 | 中文字幕欧美色图| 久久精品欧美一区二区三区麻豆 | 制服丝袜中文字幕第一页| 北条麻妃国产九九九精品小说| 茄子视频成人在线| 天堂网www中文在线| 狠狠躁夜夜躁人人爽超碰91| 美女又爽又黄免费| 亚洲精品美女| 麻豆传媒一区| 波多野结衣在线播放| 精品久久一二三区| 国产无遮挡aaa片爽爽| 成人午夜视频免费看| 99久re热视频精品98| 国产精品日韩精品在线播放| 久久精品久久久久电影| 精品毛片在线观看| 一区二区激情视频| 99久久综合网| 99在线精品视频在线观看| 美女精品国产| 亚洲第一会所| 色妞欧美日韩在线| 99精品久久久久久中文字幕| 一区二区三区在线观看国产| av天堂一区二区| 嫩草成人www欧美| 亚洲电影网站| 中文字幕成人| 欧美激情久久久久| 亚洲欧洲国产综合| 欧美日韩国产一中文字不卡| 天天爱天天做天天操| 毛片在线不卡| 日韩亚洲欧美一区| 久久国产高清视频| 成人精品视频一区二区三区| 黄色一级视频片| 精品香蕉视频| 尤物99国产成人精品视频| 2025国产精品自拍| 福利一区二区在线观看| 日韩中文字幕亚洲精品欧美| 久久精品亚洲成在人线av网址| 欧美一区二区三区免费观看| 黄色片视频在线观看| 国产成人免费视频一区| av日韩在线看| 国产伦精品一区二区三区千人斩 | 久久久99精品| 首页亚洲欧美制服丝腿| 亚洲一区二区在线看| 国产精品日韩精品在线播放| **欧美日韩vr在线| 91精品国产沙发| 无码人妻熟妇av又粗又大| 亚洲三级网站| 亚洲一区精品电影| 国产精品va在线观看视色| 精品国产老师黑色丝袜高跟鞋| 性做爰过程免费播放| 开心激情综合| 欧美性色黄大片| 久久久久久国产免费a片| 麻豆传媒在线免费看| 精品一区二区三区免费观看 | 国产精品麻豆久久| 国产高清精品一区| 国产一区影院| 国产91ⅴ在线精品免费观看| 成人在线观看亚洲| 亚洲欧美综合v| 精品人妻久久久久一区二区三区| 亚洲自拍偷拍麻豆| 成年人网站在线观看视频| 久久综合九色欧美综合狠狠| 免费黄视频在线观看| 蜜臂av日日欢夜夜爽一区| 欧美,日韩,国产在线| 天天影视天天精品| 秋霞在线观看一区二区三区| 国产精品18hdxxxⅹ在线| 国产成人精品日本亚洲| 后进极品白嫩翘臀在线播放| 亚洲视频在线播放| 亚洲美女综合网| 91精品国产欧美一区二区18 | 影音先锋中文字幕一区| 午夜在线视频免费观看| 欧美色就是色| 欧美在线一区二区三区四区| 福利电影一区| 999视频在线免费观看| 免费一级欧美在线观看视频| 日韩美女在线观看| 伊人网在线播放| 国产69精品久久久久久| 欧美sm一区| 91成人免费观看网站| 黄污视频在线观看| 九色成人免费视频| 日本高清在线观看视频| 美女av一区二区| 国产精品久久一区二区三区不卡 | 国产精品视频免费在线| 88xx成人免费观看视频库| 51色欧美片视频在线观看| 99在线视频影院| 97精品在线观看| 日韩av影片| 日本午夜在线亚洲.国产| 欧美videosex性欧美黑吊| 欧美日韩xxx| 久久一卡二卡| 久久免费精品视频| 黄色美女视频在线观看| 97福利一区二区| 三级中文字幕在线观看| 欧美最近摘花xxxx摘花| www.色在线| 51精品在线观看| gogo亚洲高清大胆美女人体| 国产精品女主播| 台湾天天综合人成在线| 91美女福利视频高清| 日韩欧美中文在线观看| 亚洲奶水xxxx哺乳期| 中文字幕日韩欧美在线| www.欧美日本韩国| 欧美亚洲国产日本| 外国成人毛片| 久久久影院一区二区三区| 欧美黄色大片在线观看| 丰满少妇久久久| 美女任你摸久久 | 中文字幕在线天堂| 91精品国产综合久久久久久久久久| 亚洲第一精品网站| 在线观看欧美日韩| 6699嫩草久久久精品影院| 国产女精品视频网站免费| 国产精品zjzjzj在线观看| 五月天丁香综合久久国产| 黄色另类av| 日韩高清第一页| 久久久久综合网| 国产第一页第二页| 欧美精品国产精品| 精品无人乱码| 91精品国产高清自在线| 国产一区二区三区国产精品| 日本视频一区在线观看| 亚洲理论在线| 在线播放第一页| 亚洲视频一二区| 国产美女www爽爽爽| 亚洲国产免费av| 青春草免费在线视频| 成人激情春色网| 成人在线免费视频观看| 99久久久无码国产精品6| 成人h动漫精品一区二区| 亚洲天堂黄色片| 欧美精品vⅰdeose4hd| 成年人免费在线视频| 日本精品一区二区三区在线播放视频| 一区二区三区四区精品视频| 特级黄色录像片| 久久er精品视频| 特黄一区二区三区| 欧美影视一区在线| 国产小视频在线观看| 欧美一级电影久久| 欧美国产极品| 99爱视频在线| 99精品国产视频| 特级毛片www| 亚洲欧美国产视频| 裤袜国产欧美精品一区| 蜜桃视频在线观看91| 国产一区二区三区的电影| 午夜视频在线观看国产| 亚洲超碰精品一区二区| 日批免费在线观看| 欧美亚洲另类在线| 亚洲免费福利一区| chinese少妇国语对白| 国产区在线观看成人精品| 波多野结衣一区二区三区四区| 亚洲欧美一区二区精品久久久| 成人小电影网站| 日韩欧美精品一区二区三区经典| 日韩精彩视频在线观看| 青青青视频在线免费观看| 欧美人伦禁忌dvd放荡欲情| 黄色精品免费看| caoporen国产精品| 99精品免费视频| 乐播av一区二区三区| 欧美猛男超大videosgay| 男人j进女人j| 国产欧美日韩小视频| 熟妇人妻系列aⅴ无码专区友真希| 日韩福利电影在线| 欧美福利视频在线| 国产农村妇女精品一区| 国产剧情一区| 亚洲白拍色综合图区| 成人免费区一区二区三区| 日韩欧美国产不卡| 精品日韩av| 免费看污久久久| 美女视频黄 久久| 国产一区二区播放| 亚洲国产高清福利视频| 日本免费久久| 天天综合五月天| www.亚洲在线| 久久精品偷拍视频| 欧美成人免费全部| 欧美激情影院| 在线能看的av网站| 亚洲国产精品麻豆| 搞黄视频在线观看| 99久久国产免费免费| 蜜桃av一区| 极品盗摄国产盗摄合集| 精品性高朝久久久久久久| 人人精品久久| 日韩中字在线观看| 欧美激情在线观看视频免费| www.色视频| 国产精品a久久久久久| 欧美精品麻豆| 无码人妻丰满熟妇啪啪欧美| 精品日韩av一区二区| 成人在线免费电影网站| av女优在线播放|