Skip to content

Commit 892fdd4

Browse files
authored
Merge pull request #12915 from quarto-dev/debug-log-python
Add more verbose about python binary check and Jupyter capabilities
2 parents 1995444 + 2714e2f commit 892fdd4

File tree

1 file changed

+44
-0
lines changed

1 file changed

+44
-0
lines changed

src/core/jupyter/capabilities.ts

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { which } from "../path.ts";
1515

1616
import { JupyterCapabilities, JupyterKernelspec } from "./types.ts";
1717
import { warnOnce } from "../log.ts";
18+
import { debug } from "../../deno_ral/log.ts";
1819

1920
// cache capabilities per language
2021
const kNoLanguage = "(none)";
@@ -24,11 +25,19 @@ export async function jupyterCapabilities(kernelspec?: JupyterKernelspec) {
2425
const language = kernelspec?.language || kNoLanguage;
2526

2627
if (!jupyterCapsCache.has(language)) {
28+
debug(
29+
"Looking for Python binaries and Jupyter capabilities" +
30+
(language === kNoLanguage ? "." : ` for language '${language}'.`),
31+
);
32+
2733
// if we are targeting julia then prefer the julia installed miniconda
2834
let juliaCaps: JupyterCapabilities | undefined;
2935
if (language === "julia") {
3036
juliaCaps = await getVerifiedJuliaCondaJupyterCapabilities();
3137
if (juliaCaps) {
38+
debug(
39+
`Using Jupyter capabilities from Julia conda at '${juliaCaps.executable}'`,
40+
);
3241
jupyterCapsCache.set(language, juliaCaps);
3342
return juliaCaps;
3443
}
@@ -37,6 +46,9 @@ export async function jupyterCapabilities(kernelspec?: JupyterKernelspec) {
3746
// if there is an explicit python requested then use it
3847
const quartoCaps = await getQuartoJupyterCapabilities();
3948
if (quartoCaps) {
49+
debug(
50+
`Python found using QUARTO_PYTHON at '${quartoCaps.executable}'`,
51+
);
4052
jupyterCapsCache.set(language, quartoCaps);
4153
return quartoCaps;
4254
}
@@ -45,28 +57,43 @@ export async function jupyterCapabilities(kernelspec?: JupyterKernelspec) {
4557
if (isWindows && pyPython()) {
4658
const pyLauncherCaps = await getPyLauncherJupyterCapabilities();
4759
if (pyLauncherCaps) {
60+
debug(
61+
`Python found via "py.exe" at ${pyLauncherCaps.executable}.`,
62+
);
4863
jupyterCapsCache.set(language, pyLauncherCaps);
4964
}
5065
}
5166

5267
// default handling (also a fallthrough if launcher didn't work out)
5368
if (!jupyterCapsCache.has(language)) {
5469
// look for python from conda (conda doesn't provide python3 on windows or mac)
70+
debug("Looking for Jupyter capabilities from conda 'python' binary");
5571
const condaCaps = await getJupyterCapabilities(["python"]);
5672
if (condaCaps?.conda) {
73+
debug(
74+
`Python found using conda at '${condaCaps.executable}'`,
75+
);
5776
jupyterCapsCache.set(language, condaCaps);
5877
} else {
5978
const caps = isWindows
6079
? await getPyLauncherJupyterCapabilities()
6180
: await getJupyterCapabilities(["python3"]);
6281
if (caps) {
82+
debug(
83+
`Python found at '${caps.executable}'`,
84+
);
6385
jupyterCapsCache.set(language, caps);
6486
}
6587
}
6688

6789
// if the version we discovered doesn't have jupyter and we have a julia provided
6890
// jupyter then go ahead and use that
6991
if (!jupyterCapsCache.get(language)?.jupyter_core && juliaCaps) {
92+
debug(
93+
`No Jupyter capabilities found for '${language}' in ${
94+
jupyterCapsCache.get(language)?.executable
95+
}, falling back to Julia conda at '${juliaCaps.executable}'`,
96+
);
7097
jupyterCapsCache.set(language, juliaCaps);
7198
}
7299
}
@@ -80,6 +107,7 @@ export async function jupyterCapabilities(kernelspec?: JupyterKernelspec) {
80107
const S_IXUSR = 0o100;
81108

82109
async function getVerifiedJuliaCondaJupyterCapabilities() {
110+
debug("Looking for Jupyter capabilities from Julia conda");
83111
let juliaHome = Deno.env.get("JULIA_HOME");
84112
if (!juliaHome) {
85113
const home = isWindows ? Deno.env.get("USERPROFILE") : Deno.env.get("HOME");
@@ -100,8 +128,12 @@ async function getVerifiedJuliaCondaJupyterCapabilities() {
100128
pythonBin,
101129
);
102130
if (existsSync(juliaPython)) {
131+
debug(`Checking Jupyter capabilities for '${juliaPython}'`);
103132
const caps = await getJupyterCapabilities([juliaPython]);
104133
if (caps?.jupyter_core) {
134+
debug(
135+
`Python with Jupyter found at '${caps.executable}' from Julia conda`,
136+
);
105137
return caps;
106138
}
107139
}
@@ -117,8 +149,12 @@ async function getVerifiedJuliaCondaJupyterCapabilities() {
117149
if (!(file.isFile && file.mode && (file.mode & S_IXUSR))) {
118150
continue;
119151
}
152+
debug(`Checking Jupyter capabilities for '${path.path}'`);
120153
const caps = await getJupyterCapabilities([path.path]);
121154
if (caps?.jupyter_core) {
155+
debug(
156+
`Python with Jupyter found at '${caps.executable}' from Julia conda`,
157+
);
122158
return caps;
123159
}
124160
}
@@ -128,27 +164,34 @@ async function getVerifiedJuliaCondaJupyterCapabilities() {
128164
async function getQuartoJupyterCapabilities() {
129165
let quartoJupyter = Deno.env.get("QUARTO_PYTHON");
130166
if (quartoJupyter) {
167+
debug(`Checking QUARTO_PYTHON set to '${quartoJupyter}'`);
131168
// if the path is relative then resolve it
132169
if (!isAbsolute(quartoJupyter)) {
133170
const path = await which(quartoJupyter);
134171
if (path) {
135172
quartoJupyter = path;
173+
debug(`Resolved QUARTO_PYTHON to '${quartoJupyter}'`);
136174
}
137175
}
138176
if (existsSync(quartoJupyter)) {
139177
let quartoJupyterBin: string | undefined = quartoJupyter;
140178
if (Deno.statSync(quartoJupyter).isDirectory) {
179+
debug(
180+
`QUARTO_PYTHON '${quartoJupyter}' is a directory, looking for python binary`,
181+
);
141182
const bin = ["python3", "python", "python3.exe", "python.exe"]
142183
.find((bin) => {
143184
return existsSync(join(quartoJupyter!, bin));
144185
});
145186
if (bin) {
187+
debug(`Found python binary '${bin}' in QUARTO_PYTHON`);
146188
quartoJupyterBin = join(quartoJupyter, bin);
147189
} else {
148190
quartoJupyterBin = undefined;
149191
}
150192
}
151193
if (quartoJupyterBin) {
194+
debug(`Checking Jupyter capabilities for '${quartoJupyterBin}'`);
152195
return getJupyterCapabilities([quartoJupyterBin]);
153196
}
154197
} else {
@@ -197,6 +240,7 @@ function pyPython() {
197240
}
198241

199242
function getPyLauncherJupyterCapabilities() {
243+
debug("Using 'py.exe' to get Jupyter capabilities");
200244
return getJupyterCapabilities(["py"], true);
201245
}
202246

0 commit comments

Comments
 (0)