Python スクリプトをコマンドライン プログラムに変換する
私はこれまでのキャリアを通じて、数多くのランダムなスクリプトを書いたり、使用したり、見たりしてきました。一部の人々は半自動タスクを必要とするため、半自動タスクが誕生しました。しばらくすると、彼らはどんどん大きくなります。彼らは一生の間に何度も手を変えるかもしれません。これらのスクリプトがもっと コマンドライン ツールのような 感覚を提供してくれるといいのにとよく思います。しかし、品質レベルを実際に向上させるために、1 回限りのスクリプトから適切なツールに移行するのはどれほど難しいでしょうか? 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://www.php.cn/link/575afbdca5a101e3088b2b6554398b0c コードで特定のバージョンを見つけることができます。このリポジトリ内の各コミットは、この記事のプロセスにおけるいくつかの意味のあるステップを説明しています。
このスニペットはいくつかのことを行います。- 指定されたパスにテキスト ファイルがあるかどうかを確認します。
存在する場合は、現在のタイムスタンプを使用して新しいファイル名を作成し、それを
ARCHIVE現在の
ARCHIVE/latest.txt リンクを削除し、追加したファイルへの新しいリンクを作成します。 例として、簡単ですが、プロセスを理解するのに役立ちます。
scaffold
をインストールし、 クリック し、
tox
Python ライブラリ 。
$ python3 -m pip install scaffold click tox
rotscope プロジェクトが配置されているディレクトリに切り替えて、次のコマンドを実行します:
$ 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 工具。
以上がPython スクリプトをコマンドライン プログラムに変換するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









C言語に組み込みの合計機能はないため、自分で書く必要があります。合計は、配列を通過して要素を蓄積することで達成できます。ループバージョン:合計は、ループとアレイの長さを使用して計算されます。ポインターバージョン:ポインターを使用してアレイ要素を指し示し、効率的な合計が自己概要ポインターを通じて達成されます。アレイバージョンを動的に割り当てます:[アレイ]を動的に割り当ててメモリを自分で管理し、メモリの漏れを防ぐために割り当てられたメモリが解放されます。

スキルや業界のニーズに応じて、PythonおよびJavaScript開発者には絶対的な給与はありません。 1. Pythonは、データサイエンスと機械学習でさらに支払われる場合があります。 2。JavaScriptは、フロントエンドとフルスタックの開発に大きな需要があり、その給与もかなりです。 3。影響要因には、経験、地理的位置、会社の規模、特定のスキルが含まれます。

H5ページは、コードの脆弱性、ブラウザー互換性、パフォーマンスの最適化、セキュリティの更新、ユーザーエクスペリエンスの改善などの要因のため、継続的に維持する必要があります。効果的なメンテナンス方法には、完全なテストシステムの確立、バージョン制御ツールの使用、定期的にページのパフォーマンスの監視、ユーザーフィードバックの収集、メンテナンス計画の策定が含まれます。

明確で明確なものは区別に関連していますが、それらは異なる方法で使用されます。明確な(形容詞)は、物事自体の独自性を説明し、物事の違いを強調するために使用されます。明確な(動詞)は、区別の動作または能力を表し、差別プロセスを説明するために使用されます。プログラミングでは、個別は、重複排除操作などのコレクション内の要素の独自性を表すためによく使用されます。明確なは、奇数や偶数の偶数を区別するなど、アルゴリズムまたは関数の設計に反映されます。最適化する場合、異なる操作は適切なアルゴリズムとデータ構造を選択する必要がありますが、異なる操作は、論理効率の区別を最適化し、明確で読み取り可能なコードの書き込みに注意を払う必要があります。

!X理解!Xは、C言語の論理的な非操作者です。 Xの値をブーリングします。つまり、虚偽の真の変化、trueへの誤った変更です。ただし、Cの真実と虚偽はブール型ではなく数値で表されていることに注意してください。非ゼロは真であると見なされ、0のみが偽と見なされます。したがって、!xは正の数と同じ負の数を扱い、真実と見なされます。

Cには組み込みの合計関数はありませんが、次のように実装できます。ループを使用して要素を1つずつ蓄積します。ポインターを使用して、要素に1つずつアクセスして蓄積します。大量のデータ量については、並列計算を検討してください。

クロール中に58.com作業ページの動的データを取得するにはどうすればよいですか? Crawlerツールを使用して58.comの作業ページをrawったら、これに遭遇する可能性があります...

PSの「読み込み」の問題は、リソースアクセスまたは処理の問題によって引き起こされます。ハードディスクの読み取り速度は遅いか悪いです。CrystaldiskInfoを使用して、ハードディスクの健康を確認し、問題のあるハードディスクを置き換えます。不十分なメモリ:高解像度の画像と複雑な層処理に対するPSのニーズを満たすためのメモリをアップグレードします。グラフィックカードドライバーは時代遅れまたは破損しています:ドライバーを更新して、PSとグラフィックスカードの間の通信を最適化します。ファイルパスが長すぎるか、ファイル名に特殊文字があります。短いパスを使用して特殊文字を避けます。 PS独自の問題:PSインストーラーを再インストールまたは修理します。
