====== Python for Scripting ======
===== Setup =====
python3 --version # already installed
sudo apt install python3-pip python3-venv
Ubuntu blocks ''pip install'' system-wide (PEP 668): use a venv:
python3 -m venv ~/.venvs/myproj
source ~/.venvs/myproj/bin/activate
pip install requests
deactivate
Or install distro packages: ''sudo apt install python3-requests python3-bs4''.
Quick escape hatch without a venv: ''pip install --user --break-system-packages pkg''
: fine for a personal laptop, worth knowing it bypasses the guard.
===== Script skeleton =====
#!/usr/bin/env python3
"""one-line description"""
import sys
def main() -> int:
return 0
if __name__ == "__main__":
sys.exit(main())
chmod +x, ''./script.py''. Or a ''#!/usr/bin/env -S python3'' shebang.
===== Recipes =====
# argparse
import argparse
p = argparse.ArgumentParser()
p.add_argument("file"); p.add_argument("-n", "--dry-run", action="store_true")
args = p.parse_args()
# files
from pathlib import Path
for f in Path("~/notes").expanduser().rglob("*.md"):
text = f.read_text(encoding="utf-8")
# json / csv / yaml
import json, csv
data = json.loads(Path("in.json").read_text())
rows = list(csv.DictReader(open("in.csv")))
# yaml: pip install pyyaml -> yaml.safe_load(text)
# subprocess
import subprocess
out = subprocess.run(["grep", "-c", "x", "f.txt"],
capture_output=True, text=True, check=True).stdout
# http (stdlib, no deps)
from urllib.request import urlopen
html = urlopen("https://example.com", timeout=10).read()
# http (requests, if installed)
import requests
r = requests.get("https://api.github.com", timeout=10)
r.raise_for_status(); j = r.json()
# env + exit codes
import os, sys
token = os.environ.get("TOKEN") or sys.exit("set TOKEN first")
# dates
from datetime import datetime, timedelta
stamp = datetime.now().strftime("%Y-%m-%d %H:%M")
===== REPL & debugging =====
python3 # repl
python3 -i script.py # run then drop into repl
python3 -m pdb script.py # debugger
breakpoint() # in code, python >=3.7
===== Useful stdlib modules (no pip needed) =====
''pathlib'' ''shutil'' ''subprocess'' ''argparse'' ''json'' ''csv'' ''sqlite3'' ''re''
''datetime'' ''os''/''os.path'' ''sys'' ''textwrap'' ''logging'' ''http.server'' ''zipfile''
''tarfile'' ''statistics'' ''collections'' ''itertools'' ''functools'' ''dataclasses''
===== Quick servers & tools =====
python3 -m http.server 8000 # serve cwd over HTTP
python3 -m json.tool < file.json # pretty-print/validate JSON
python3 -m venv --help
pip list / pip show pkg / pip install -r requirements.txt
===== When performance hurts =====
* Startup is fine; CPU-bound loops are slow: use ''numpy'' for number work or
push the hot path to ''subprocess''-ed tools (grep, ffmpeg).
* ''python3 -O'' drops asserts. ''cProfile'' for real profiling:
''python3 -m cProfile -s cumtime script.py | head -20''
===== See Also =====
* [[terminal:scripting:start|Scripting Index]]
* [[terminal:tools:start|CLI Tools]]
* [[terminal:start|Return to terminal]]
* [[start|Return to wiki home]]