Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NPM - package.json#engines | How to specify Python?

I need to specify a python version on my package.json.

Can I simple do: { engines: { "python": "2.7.11" } } ?

like image 963
Hitmands Avatar asked May 03 '26 13:05

Hitmands


1 Answers

As of NPM 7.x (same is valid for legacy NPM 6.x), the only valid entries for "engines" field in package.json, are the "node" version, and the "npm" version. Furthermore, this is not a hard constraint unless you use "engine-strict" as well, as stated by the NPM docs:

Unless the user has set the engine-strict config flag, this field is advisory only and will only produce warnings when your package is installed as a dependency.

Your requirement, expecting a specific python version, is more related to an environment requirement than to your Node/NPM environment.

You can achieve this by implementing a "postinstall" NPM script that can result an error if the desired version is not found:

{ 
  "scripts": {
    "postinstall": "node ./check-python.js"
  }
}

This script will be executed by NPM automatically after npm install. You could also use "preinstall" instead. Consider using it on your "build" or "prebuild" scripts as well, based on your requirements. See more details on NPM pre- and post- scripts in the docs.

Then, your check-python.js script could be something like:

const { exec } = require('child_process');

const EXPECTED_PYTHON_VERSION = "2.7.11";

exec('python -c "import platform; print(platform.python_version())"',
     function(err, stdout, stderr) {
  const currentPythonVersion = stdout.toString();
  if(currentPythonVersion !== EXPECTED_PYTHON_VERSION) { 
    throw new Error(`Expected Python version '${EXPECTED_PYTHON_VERSION}' but found '${currentPythonVersion}'. Please fix your Python installation.`);
  }
});
like image 145
tmilar Avatar answered May 06 '26 04:05

tmilar