精品欧美一区二区三区在线观看 _久久久久国色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高潮尖叫在线观看| 精品不卡一区二区三区| 91香蕉视频污在线观看| 欧美三级一区| 天天色天天操综合| 亚洲激情图片| 成人午夜免费福利| 久久综合婷婷| 欧美理论片在线观看| 人妻熟女aⅴ一区二区三区汇编| 欧美与亚洲与日本直播| 亚洲永久免费av| 日韩欧美视频一区二区三区四区| 精品国产av一区二区| 久久久噜噜噜| 色综合男人天堂| 永久免费av无码网站性色av| 久久人人爽人人爽人人片av不| 欧美三区在线观看| 欧美激情 国产精品| 成人video亚洲精品| 久久久99久久| 激情视频在线观看一区二区三区| 国产一区二区三区在线观看| 亚洲影视综合| 久久久免费高清电视剧观看| 99re6热在线精品视频| 婷婷成人影院| 亚洲国产日韩欧美在线图片| 韩国一区二区在线播放| 精品成人免费一区二区在线播放| 图片区日韩欧美亚洲| 国产又粗又猛又爽又黄的网站| 9191在线观看| 国产亚洲精品久| 国内不卡一区二区三区| 国产高清免费在线观看| 久久66热re国产| 国产精品精品视频| 波多野结衣在线观看视频| 中文日韩欧美| 性色av一区二区三区| 久久精品这里只有精品| 在线精品国产| 不卡av在线播放| 手机av在线看| 91精品一区二区三区综合在线爱 | 六月丁香综合网| 黄色精品一二区| 成人黄色av播放免费| 中文字幕人成人乱码亚洲电影| 老司机精品导航| 日本免费久久高清视频| 国产精品久久久久久久久久久久久久久久久 | 最近2019中文免费高清视频观看www99| 亚洲天堂网一区二区| 精品一区二区男人吃奶| 亚洲精品xxx| 亚洲最大的黄色网| 一本久久青青| 中文字幕久久久| 亚洲欧洲综合网| 亚洲激情中文在线| 欧美成人午夜影院| 免费中文字幕在线观看| 尤物在线精品| 日韩免费黄色av| 亚洲精品国产精品国自产网站按摩| 日本网站在线观看一区二区三区 | 欧美成人午夜激情视频| 四虎永久在线精品| 欧美亚洲视频| 国产精品永久免费| 国产成a人亚洲精v品无码| 懂色av一区二区夜夜嗨| 久久久av水蜜桃| 超碰在线国产| 亚洲免费观看高清在线观看| 97在线国产视频| 欧美日韩美女| 欧美一区二区三区电影| 日韩精品视频一区二区| 欧美日韩一二| 欧美黑人国产人伦爽爽爽| 免费在线不卡视频| 九九国产精品视频| 国产欧美日韩综合精品二区| 国产精品一区在线看| 国产精品福利一区二区三区| 91免费黄视频| 久久久久毛片| 亚洲精品国产精品久久清纯直播 | 日韩av福利在线观看| 欧美韩一区二区| 色av吧综合网| xxxx.国产| 韩国一区二区在线观看| 久99久视频| 2024最新电影免费在线观看| 日韩欧美成人网| 69久久精品无码一区二区| 日韩精品欧美大片| 久久av.com| 国产天堂第一区| 处破女av一区二区| 亚洲综合首页| 国产精品伦理| 精品1区2区在线观看| 国产又粗又猛又爽又黄的视频小说| 黄色亚洲精品| 国产中文字幕日韩| 四虎影院在线域名免费观看| 亚洲欧洲综合另类在线| 国产一线二线三线在线观看| 黑色丝袜福利片av久久| 欧美成年人在线观看| 91黑人精品一区二区三区| 国产白丝精品91爽爽久久| 亚洲三区在线观看| 偷拍自拍在线看| 精品国产乱码91久久久久久网站| 免费精品在线视频| 久久精品一本| 狠狠色伊人亚洲综合网站色| 性欧美高清come| 欧美绝品在线观看成人午夜影视| 国产aⅴ激情无码久久久无码| 国产精品theporn| 成人欧美一区二区三区在线| 91最新在线| 欧美性猛交xxxx黑人交| 成人黄色免费网址| 久久精品中文| 欧美日韩国产免费一区二区三区 | 色哟哟在线观看一区二区三区| 久久久久中文字幕亚洲精品| 欧美成人精品| 亚洲一区二区三区在线视频| 国产精品久久久久久福利| 欧美性受xxxx黑人xyx性爽| 少妇真人直播免费视频| 国产视频一区三区| 美乳视频一区二区| 超级碰碰久久| 亚洲天堂av在线免费观看| 国产伦精品一区二区三区视频网站| 99re视频这里只有精品| 一区二区传媒有限公司| 日韩丝袜视频| 国产成人短视频| 第一页在线观看| 欧美在线视频全部完| 在线观看日本黄色| 美女国产一区二区三区| 在线亚洲美日韩| 成人97精品毛片免费看| 欧美成年人在线观看| 亚洲精品一区二区三区蜜桃| 亚洲一区二区三区国产| 日本一区二区在线免费观看| 亚洲影院在线| 亚洲国产婷婷香蕉久久久久久99| 久久91视频| 美女999久久久精品视频 | 国产成a人无v码亚洲福利| 免费的一级黄色片| 日韩激情网站| 国产精品久久二区| 国产午夜精品久久久久免费视| 日韩欧美一卡二卡| 韩国av免费观看| 久久久精品tv| 婷婷中文字幕在线观看| 激情欧美日韩| 日韩免费电影一区二区| 国产95亚洲| 97在线观看视频| 黄色在线播放| 日韩精品专区在线| 你懂的国产在线| 亚洲视频一区在线| 伊人网综合视频| 蜜桃精品视频在线| 久久男人资源站| 国产剧情在线观看一区| 91老司机在线| 亚洲v.com| 久久影院模特热| 欧美巨乳在线| 日韩欧美精品三级| 国产精品尤物视频| 亚洲国产综合色| 女人裸体性做爰全过| av电影天堂一区二区在线观看| 手机看片一级片| 在线综合亚洲| 一本色道久久88亚洲精品综合 | 国产不卡免费视频| 在线观看高清免费视频| 亚洲天堂久久| 亚洲视频在线二区| 秋霞综合在线视频| 91欧美精品午夜性色福利在线 | 欧美视频不卡| 亚洲欧洲精品在线观看| 日韩免费电影在线观看| 亚洲最大福利视频网站| 欧美日韩亚洲国产| 2021国产精品视频| 蜜臀av在线| 久久九九免费视频| 成人在线免费公开观看视频| 亚洲国产精品久久久| 国产视频www| 欧美私人免费视频| 老熟妇仑乱一区二区av| 亚洲国产一二三| xxxx日本少妇| 国产精品国产三级国产三级人妇| 午夜一区二区三区免费| 国产精品一区一区三区| www日韩视频| 一区二区毛片| 国产手机免费视频| 韩国一区二区三区在线观看| 日韩最新中文字幕| 91精品国产麻豆国产在线观看| 欧美一区二区三区在线免费观看| 久久人人爽人人爽人人片av不| 97超碰资源| 日韩精品中文字幕吗一区二区| 成人精品视频久久久久| 国产精品久久久久久吹潮| 国产福利视频一区| 肉色欧美久久久久久久免费看| 97欧美精品一区二区三区| 国产盗摄精品一区二区酒店| 久久久久久com| 欧美xxxx黑人又粗又长| 欧美人与物videos| 毛片大全在线观看| 久久人人爽人人爽人人片av高请| 在线免费观看的av| 欧美裸身视频免费观看| 毛片在线导航| 国产综合在线看| 川上优av中文字幕一区二区| 97视频在线观看免费高清完整版在线观看| 三级资源在线| 久久全球大尺度高清视频| av手机在线观看| 青青草原一区二区| 欧美动物xxx| 国产在线观看91精品一区| 亚洲网站三级| 成人av免费电影| 久久香蕉精品香蕉| 蜜桃传媒视频第一区入口在线看| 九一亚洲精品| 在线观看日韩羞羞视频| 午夜欧美精品久久久久久久| 3d动漫一区二区三区| 丝袜美腿亚洲综合| 亚洲精品久久久中文字幕| 久久99精品国产91久久来源| 波多野结衣电影免费观看| 成人av在线网站| 日本一区二区视频在线播放| ...中文天堂在线一区| 国产精品成人久久| 在线中文字幕不卡| 一本久道久久综合无码中文| 欧美v日韩v国产v| 青青草av免费在线观看| www.色综合| 变态调教一区二区三区| 日韩免费观看av| 国产一区二区三区免费在线| 国产精品午夜av在线| 国产欧美日韩影院| 99久re热视频精品98| 国产一区二区三区久久| 日韩精品视频一二三| 岛国一区二区在线观看| 亚洲高潮女人毛茸茸| 一区二区三区丝袜| 日韩av免费播放| 日韩欧美在线网站| 韩国福利在线| 久久久久久久久网站| 999国产精品亚洲77777| 国产精品入口免费| 欧美肥老太太性生活| 欧美亚洲精品一区二区| 精品在线播放午夜| 特大黑人巨人吊xxxx| ㊣最新国产の精品bt伙计久久| 国产精品7777777| 91精品久久久久久久91蜜桃| 男人天堂综合| 欧美精品电影在线| 996久久国产精品线观看| 欧美精品久久久| 亚洲黄色天堂| 中文字幕在线观看视频www| 国产视频在线观看一区二区三区 | 黄av在线播放| 国产精品久久久久久久久久东京| 凹凸成人在线| 午夜久久久久久久久久久| 日本午夜一本久久久综合| 免费a级黄色片| 亚洲国产精品视频| 国产女18毛片多18精品| 中文字幕精品一区久久久久| 成人美女大片| 国新精品乱码一区二区三区18| 国产精品国产一区| 三级a在线观看| 久久久国际精品| 国产亚洲欧美久久久久| 欧美一级一区二区| 免费网站黄在线观看| 国产精品免费观看在线| 免费成人av| 1024精品视频| jizz一区二区| 日韩av黄色片| 精品国产免费一区二区三区四区 | 亚洲高清中文字幕| 国产肥老妇视频| 久久五月天色综合| 91麻豆精品| dy888午夜| 狠狠色丁香久久婷婷综合丁香| 东京热无码av男人的天堂| 欧美性大战久久| 91大神xh98hx在线播放| 国产日本欧美一区| 亚洲电影影音先锋| 肉色超薄丝袜脚交| 亚洲麻豆国产自偷在线| 国产人妖一区二区| 欧美国产精品va在线观看| 日韩在线精品强乱中文字幕| 国产情侣第一页| 粉嫩蜜臀av国产精品网站| 国产污片在线观看| 亚洲精品视频二区| 日韩漫画puputoon| 中文字幕免费在线不卡| 国产一区激情在线| 久久精品国产av一区二区三区| 精品区一区二区| 欧美调教sm| 亚洲成人自拍| 国产伦理精品不卡| 久久久久久久久99| 亚洲国产小视频| 日韩三区在线| 一区二区在线高清视频| 国产乱理伦片在线观看夜一区| 国产在线视频二区| 亚洲视频电影图片偷拍一区| 国产成人福利夜色影视| 欧美另类videos| av不卡在线播放| 亚洲精品毛片一区二区三区| 久久久国产91| 久久99国产精品久久99大师 | 亚洲色图美腿丝袜| 日韩精品一级毛片在线播放| 300部国产真实乱| 久久综合国产精品| 91丨porny丨在线中文 | 免费av一区二区| 黑人久久a级毛片免费观看| av观看免费在线| 成人欧美一区二区三区视频网页| 亚洲第一免费视频| 国产成人综合久久| 午夜精品久久久久99热蜜桃导演| 国产麻豆xxxvideo实拍| 欧美三级视频在线观看| 在线播放蜜桃麻豆| 秋霞在线观看一区二区三区| 国产一区二区不卡| 日韩色图在线观看| 欧美精品一区在线播放| 女厕嘘嘘一区二区在线播放 | 国产校园另类小说区| 国产农村妇女毛片精品| 国产成人福利网站| 国内久久精品| 精品少妇一区二区三区密爱| 精品视频久久久久久| 国产欧美日韩电影| 丁香婷婷激情网| 性久久久久久久久久久久| 黄色视屏免费在线观看|