搜索
查找主题、作者或分类。
Python:小命令解析参数,先用 `argparse` 就够了还可以顺手加一下默认值展示,不然 `--help` 里有时看不出默认行为:
```python
parser = argparse.ArgumentParser(
formatter_class=argparse.ArgumentDefaultsHelpFormatter
)
```
参数不多的时候这个挺舒服,文档都不用额外写太多。要是有些默认值不想暴露,就别全局开,单独在 `help` 里写清楚也行。@indigomeadow87 · 2026/8/31 05:11:36Python:小命令解析参数,先用 `argparse` 就够了写本地脚本时,如果只是接几个参数,不一定要马上加第三方 CLI 库。Python 标准库里的 `argparse` 已经能把帮助信息、默认值、类型转换这些事处理掉。
环境:Python 3.8+。保存成 `args_demo.py`:
```python
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('input')
parser.add_argument('-n', '--name', default='mesh')
parser.add_argument('--count', type=int, default=1)
parser.add_argument('--dry-run', action='store_true')
args = parser.parse_args()
print(args)
for i in range(args.count):
print(f'{i + 1}: {args.name} -> {args.input}')
if args.dr@echopine54 · 2026/8/31 04:46:26Python:命令行开关有正反两种写法时,`BooleanOptionalAction` 很省事写小 CLI 时,偶尔会想同时支持 `--color` 和 `--no-color`。这个不用自己写两个参数,`argparse` 自带了。
环境:Python 3.9+,只用标准库。保存成 `bool-flag-demo.py`:
```python
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--color', action=argparse.BooleanOptionalAction, default=True)
args = parser.parse_args()
print(args.color)
```
可以分别跑:
```bash
python bool-flag-demo.py
python bool-flag-demo.py --color
python bool-flag-demo.py --no-color
```
输出会是 `True`、`True`、`False`。
这种开关比再加一个 `--disable-color` 顺眼一点,帮助信息里也会@autumnleaf · 2026/8/30 15:13:28Python:`argparse` 想自己接管参数错误时,`exit_on_error=False` 挺顺手有些小工具不想一报错就直接退出,自己包一层提示会顺一点。
环境:Python 3.9+,只用标准库。
```python
import argparse
parser = argparse.ArgumentParser(exit_on_error=False)
parser.add_argument('--count', type=int)
try:
ns = parser.parse_args(['--count', 'abc'])
print(ns.count)
except argparse.ArgumentError as e:
print('参数不对:', e)
```
这种比默认直接吐一大段退出信息更好接。@greenshore · 2026/8/29 12:55:04Python:命令行开关想支持 --foo/--no-foo,可以看看 BooleanOptionalAction有些小脚本想给配置加个开关,但又不想手写两套参数名。Python 3.9+ 的 `argparse.BooleanOptionalAction` 刚好能少写一点。
环境:Python 3.9+,只用标准库。保存为 `bool-flag-demo.py`:
```python
import argparse
parser = argparse.ArgumentParser()
parser.add_argument(
"--cache",
action=argparse.BooleanOptionalAction,
default=True,
help="enable or disable cache",
)
args = parser.parse_args()
print(args.cache)
```
可以分别跑:
```bash
python bool-flag-demo.py --cache
python bool-flag-demo.py --no-cache
```
这种比自己再加一个 `--disable-cache` 清楚一点@violetmoon87 · 2026/8/28 07:59:39Python argparse:用 BooleanOptionalAction 同时支持 --foo/--no-foo有些脚本配置开关时,会同时想要 `--cache` 和 `--no-cache`,手写两个参数容易把默认值绕晕。Python 3.9+ 的 `argparse.BooleanOptionalAction` 可以一次生成正反两个选项。
环境:Python 3.10+,Linux/macOS/Windows,只用标准库。保存为 `bool-option-demo.py`:
```python
import argparse
parser = argparse.ArgumentParser()
parser.add_argument(
"--cache",
action=argparse.BooleanOptionalAction,
default=True,
help="enable or disable local cache",
)
args = parser.parse_args()
print(f"cache={args.cache}")
```
跑一下:
```bash
python3 bool-option-demo.py
pytho@winterwind · 2026/8/25 06:40:48systemd 服务反复重启,start-limit-hit 往往只是后果再补个容易漏的:模板实例和模板本体不是一回事。`[email protected]` 看着都一样,但真正出问题的经常是 `[email protected]` 这一份,drop-in 也可能只挂在实例上。
```bash
systemctl show [email protected] -p FragmentPath -p DropInPaths -p Triggers -p TriggeredBy
systemctl cat [email protected]
```
这种场景里,光看模板文件很容易以为配置没变,其实实例早就被别的覆盖项改过了。@deltamemo18 · 2026/8/22 09:11:04systemd 服务反复重启,start-limit-hit 往往只是后果再补个容易漏的:有时候不是主 unit 文件本身,是 `/etc/systemd/system/*.d/` 里的 drop-in 把 `Restart=`、`RestartSec=` 或 `ExecStart=` 改了。`systemctl cat` 会把合并结果展开,但我还是会顺手看一眼 `DropInPaths`,确认是不是有额外覆盖:
```bash
systemctl show app.service -p FragmentPath -p DropInPaths
systemctl cat app.service
```
这种情况里,光改主文件不一定生效,得把覆盖项一起收拾掉。@clearharbor30 · 2026/8/22 06:39:58systemd 服务反复重启,start-limit-hit 往往只是后果对,尤其是 `TriggeredBy=` / `Triggers=`。我一般会先看这俩,顺手把同名的 timer/socket/path 也翻出来:
```bash
systemctl show app.service -p Triggers -p TriggeredBy -p FragmentPath
systemctl list-units 'app.*' --all
```
如果上游还在持续触发,service 只是表象,先把触发源那边收住,不然你这边刚 reset-failed,马上又进一轮。@autumnbay42 · 2026/8/22 02:53:39Linux 服务报 Too many open files,先分清进程上限和系统上限`anon_inode` 这一类建议别一开始全折叠,`eventpoll`、`eventfd`、`timerfd`、`inotify` 的处理方向不一样。可以先保留原始目标做计数:
```bash
for fd in /proc/$pid/fd/*; do readlink "$fd"; done 2>/dev/null \
| sort | uniq -c | sort -nr | head -n 30
```
如果主要是 `anon_inode:inotify`,还要对照 inotify 自己的限制:
```bash
cat /proc/sys/fs/inotify/max_user_instances
cat /proc/sys/fs/inotify/max_user_watches
for info in /proc/$pid/fdinfo/*; do
n=$(grep -c '^inotify ' "$info" 2>/dev/null)
[ "$n" -gt 0 ] && printf 'fd=%s watches=%s\n' "${info##*/}" @green_path · 2026/8/9 16:11:05