Project Icon

pyp

Python命令行工具简化shell脚本编写

pyp是一款Python命令行工具,能在shell环境中执行Python代码。它通过静态分析检测未定义变量并转换抽象语法树,实现自动导入模块、智能打印等功能。pyp可用简洁的Python代码替代常见shell工具,提高脚本编写效率。该工具还支持自定义配置和魔法变量,为用户提供灵活的shell处理体验。

pyp

构建状态 覆盖率状态 使用mypy检查

在命令行轻松运行Python!神奇但从不神秘。

安装

运行 pip install pypyp (注意多了一个"yp"!)

pyp 需要 Python 3.8 或更高版本。

工作原理

pyp 会静态分析输入代码以检测未定义的变量。根据发现的结果,它会根据需要对输入代码的AST进行转换。然后我们编译并执行结果,或者如果使用 --explain,则将AST反解析回源代码。

示例

本节将引导您了解使用pyp的详细信息,希望能替代您对许多常见shell工具的需求。要获取速查表/简要说明,请运行 pyp --help

pyp可以轻松用于对输入的每一行应用Python代码。

只需使用魔术变量 xlline 来引用当前行。

# pyp 类似 cut
ls | pyp 'x[:3]'
ps x | pyp 'line.split()[4]'

pyp也可以轻松地对整个输入应用Python代码。

使用魔术变量 lines 获取去除右侧空白的行列表,或使用 stdin 获取 sys.stdin

# pyp 类似 wc -c
cat /usr/share/dict/words | pyp 'len(stdin.read())'

# pyp 类似 awk
seq 1 5 | pyp 'sum(map(int, lines))'

pyp 会自动导入您使用的模块。

# pyp 类似 sh
echo echo echo | pyp 'subprocess.run(lines[0], shell=True); pass'

# pyp 类似 jq
curl -s 'https://api.github.com/repos/hauntsaninja/pyp/commits?per_page=1' | pyp 'json.load(stdin)[0]["commit"]["author"]'

# pyp 类似 egrep
cat /usr/share/dict/words | pyp 'x if re.search("(p|m)yth", x) else None'

对于 collectionsmathitertoolspathlib.Pathpprint.pp,即使您不使用完全限定名,pyp也能识别。

# pyp 类似 bc
pyp 'sqrt(5)'

# pyp 类似 ${x##*.}
ls | pyp 'Path(x).suffix'

pyp 可以使用魔术变量 iidxindex 访问循环索引。

# pyp 类似行号
cat setup.py | pyp 'f"{idx+1: >3} {x}"'

注意到目前为止您还没有调用 print

默认情况下,pyp 会打印代码中的最后一个表达式 — 除非它的值为 None(或最后一条语句是 pass)。 您随时可以显式调用 print,这种情况下 pyp 不会干扰您的输出。

# pyp 类似 grep
cat /usr/share/dict/words | pyp 'x if "python" in x else None'
cat /usr/share/dict/words | pyp 'if "python" in x: print(x); "this will not be printed"'

pyp 会尝试智能地打印字典和可迭代对象。

这使得 pyp 的输出更容易与shell工具组合使用。 同样,显式打印会停止这种魔法行为,但如果您确实想要显式选择这种行为,pyp 提供了 pypprint 函数。

# pyp 类似 tail
ls | pyp 'lines[-10:]'

# pyp 类似 sort
ls | pyp 'sorted(lines)'
ls | pyp 'print(f"Sorting {len(lines)} lines"); pypprint(sorted(lines))'

# pyp 类似 sort | uniq
ls | pyp 'sorted(set(lines))'

pyp 允许您在处理输入之前和之后运行Python代码片段。

注意,如果您在使用分号时遇到麻烦,想要换行(而不在shell中使用多行字符串),您可以直接向pyp传递另一个字符串。您也可以随时将pyp的输出管道到另一个pyp命令!

# pyp 可以做任何事!
ps aux | pyp -b 'd = defaultdict(list)' 'user, pid, *_ = x.split()' 'd[user].append(pid)' -a 'del d["root"]' -a 'd'

pyp 可以是神奇的,但它不必是神秘的!

使用 --explain--script,pyp 将输出一个等效于它将运行的脚本。这也可以作为更复杂脚本的有用起点。

pyp --explain -b 'd = defaultdict(list)' 'user, pid, *_ = x.split()' 'd[user].append(pid)' -a 'del d["root"]' -a 'd'
#!/usr/bin/env python3
from collections import defaultdict
from pyp import pypprint
import sys
d = defaultdict(list)
for x in sys.stdin:
    x = x.rstrip('\n')
    (user, pid, *_) = x.split()
    d[user].append(pid)
del d['root']
if d is not None:
    pypprint(d)

如果您的命令遇到异常,pyp 将重构一个指向生成代码的回溯。

pyp 是可配置的。

将环境变量 PYP_CONFIG_PATH 指向一个包含以下内容的文件,例如:

import numpy as np
import tensorflow as tf
from pipetools import *

def p95(data):
    return np.percentile(data, 95)

class PotentiallyUsefulClass: ...

在尝试定义未定义的名称时,pyp 会静态*分析这个文件作为可能定义的来源。这意味着如果您不使用 tf,我们就不会导入 tensorflow!当然,--explain 会准确显示运行的内容(因此也会显示未运行的内容!):

pyp --explain 'print(p95(list(map(float, stdin))))'
#!/usr/bin/env python3
import sys
import numpy as np

def p95(data):
    return np.percentile(data, 95)
stdin = sys.stdin
print(p95(list(map(float, stdin))))

注意,在配置中从像 pipetools 这样的库导入可以让您实现高度的语法糖:

seq 1 110 | pyp 'lines > foreach(int) | where(X > 100) | group_by(X % 3) | sort_by(X[0])'

*如果您使用通配符导入,如果还有未定义的名称,我们将需要导入这些模块,尽管在正常情况下我们会跳过这一步。如果这对您很重要,请绝对不要在配置中使用 from tensorflow import *

pyp 允许您配置自己的魔法!

如果您的配置文件中的定义依赖于魔术变量,pyp 会以合理的方式替换它们。例如,在您的配置中放入以下内容...

n = int(x)
f = x.split()
j = json.load(stdin)

import pandas as pd
csv = pd.read_csv(stdin)

...让pyp更容易满足您的自定义用例:

ps | pyp 'f[3]'

cat commits.json | pyp 'j[0]["commit"]["author"]'

< cities.csv pyp 'csv.to_string()'

我有问题!

FAQ中有更多文档和示例。 如果那里没有回答您的问题,请提出issue!

相关项目

Pyed Piper 又名 Python Power at the Prompt

pypyp从这里获得灵感(和命令名称!)。

当pypyp编写时,Pyed Piper已经死亡且只支持Python 2十年了; 最近它似乎又复活了。Pyed Piper比pypyp更远离正常的Python语法和API。特别是,Pyed Piper强调在Python内部管道,类似于您可以在上面的配置示例中将pypyppipetools结合使用的方式。

Pyped

Pyped非常相似;如果我知道它的存在,可能就不会写pyp了。但我很高兴我不知道,因为Pyped没有我们做的AST内省和操作。这意味着:

  • Pyped依赖您传入标志来告诉它该做什么,而pyp可以从输入中明确推断意图。
  • 它不提供简单的自动打印,或智能打印迭代器和字典。
  • 它硬编码了一个导入列表,并在您的系统上安装了一些库。这个项目的自动导入可以用于您使用的任何库。
  • 它没有类似--explain/--script的功能。

然而,

  • 它有一些便利功能,比如输入的正则表达式拆分,在这里您必须自己完成。
  • 它支持Python 2和早期版本的Python 3。
  • 它存在的时间要长得多。

piep / spy / pyfil / pythonpy / oneliner

自从编写pyp以来,我发现比我想象的更多的替代方案 :-) 一些简短的说明:

  • 大多数都像Pyped一样依赖用户传入标志。
  • 大多数在自动打印方面有限制,比如只能自动打印单个表达式或不能很好地处理迭代器和字典。
  • 有些有用于进程内命令链接的自定义语法,这可能很方便。
  • 有些对JSON输入或运行shell命令等有专门的支持。
  • 有些以有趣的方式通过自定义行/文件/流对象公开输入。
  • 有些有更高级的错误处理选项(尽管没有一个有pyp的出色回溯)。
  • 没有一个像pyp那样有强大的配置。
  • 没有一个有类似--explain的功能。

无论如何,我按照个人喜好的大致顺序列出了上述项目。

mario

mario是一个功能丰富的shell处理Python方案。它不使用未定义名称检测,而是依赖可插拔的子命令系统。虽然子命令可能比pyp更冗长,但mario通过自动应用函数和自定义命令链接语法弥补了一些差距。结果可能感觉有点像DSL,而pyp试图感觉非常接近编写Python。

如果以下情况,请考虑使用mario:

  • 您发现自己串联了很长的pyp命令序列,并希望能够在单个进程中进行命令链接。
  • 您经常需要重用复杂的pyp命令,或者进行大量特定领域的shell处理,希望可以用一个命令重用。
  • 您想轻松使用异步函数。

如果以下情况,请考虑使用pyp:

  • 您想最大限度地减少应该快速简单的操作的按键次数。
  • 您想要一个简单轻量级的,感觉非常接近Python的工具。您不想记住命令。
  • 您乐于使用Python库进行特定领域的繁重工作,以便于命令链接或语法糖。您不介意(或希望能够)通过--script回退到脚本来处理复杂性。

xonsh

xonsh是一个语言为Python超集的shell;这比pyp更有野心,也非常不同。pyp更容易用于一行命令管道用例,但如果您需要在shell中使用更多Python,请查看xonsh

awk

如果awk适合您,您是怎么找到这里的?

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号