notebook-fix-packages
Keep the Docker container aligned with the template and install Python packages directly in the notebook
Files1
View on GitHubSKILL.md.claude/skills/notebook.fix_packages/SKILL.md
GitHubGoal
- When creating Docker images for projects and tutorials, we want to
- Always use the same Docker template image from
class_projectto avoid replicating Docker containers - Install the needed packages in the notebooks to customize the container
- Always use the same Docker template image from
Inputs
- The user passes:
- A target dir
<TARGET_DIR>(e.g.,msml610/tutorials/L03_knowledge_representation) cloned fromclass_project/project_template - (Optional) pointers to Jupyter notebooks
- A target dir
Workflow
Use the Docker Container From the Project Teamplate
- In the project dir (e.g.,
msml610/tutorials/L03_knowledge_representation), use the sameDockerfileandrequirements.txtas the matching files inclass_project/project_template, so the project container matches the class project template - If the image needs something that
pipcannot install, add it toDockerfilewith a clear comment on why it is needed
Discover All Packages Needed by the Notebook
A notebook's own
importlines are not the full picture. Each notebook pairs with a*_utils.pyfile (e.g.,L03_06_logic_solvers.ipynb->L03_06_logic_solvers_utils.py), imported with a line like:import L03_06_logic_solvers_utils as utilsRead the
*_utils.pyfile and any local module it imports (transitively). Collect every third-partyimport/from ... importstatement, not just those in the notebookMap import names to pip names where they differ (e.g.,
cv2->opencv-python,sklearn->scikit-learn,PIL->Pillow,yaml->PyYAML)Diff this full list against
requirements.txtandDockerfile. A package used by the notebook or its utils that is missing from both is a bug, even if it is already installed in the container used to author the notebookAdd every missing package to
requirements.txt, and toDockerfileonly if it cannot be installed withpip(per## Use the Docker Container from the Project Teamplateabove)
Add Packages to Notebooks
Add a
pip installcell for the packages needed in each notebook, including every package from## Discover All Packages Needed by the Notebookabove. Install and pin the versionsFor each notebook, add after the first call with
%load_ext autoreload %autoreload 2 import logginga cell with content like:
!pip install -q python-sat==1.9.dev15 sympy==1.14.0 z3-solver==5.1.0.0 import pysat print("pysat version: ", pysat.__version__) import sympy print("sympy version: ", sympy.__version__) import z3 print("z3 version: ", z3.get_version_string())
Sync Notebook
- At the end, sync the paired
.pyfile with Jupytext following the conventions in# Code Architecture and Responsibility->## Utilities vs. Notebook Responsibilitiesin.claude/skills/notebook.rules.md
Verification
- Every third-party import in the notebook and its paired
*_utils.pyfile has a matching entry inrequirements.txtand in the notebook'spip installcell - Build the docker container with
docker_build.shinside the target dir<TARGET_DIR> - Make sure the container builds correctly and it's the same as the Docker container for the project, if possible
- Run each notebook inside the docker container with
docker_cmd.shandnbconvertto make sure they run correctly end-to-end
Conventions
- Always follow the conventions and guidelines in
.claude/skills/notebook.rules.md