- Embed
node_modules/in Python environments require_node_modulesin setup.py- Runinstalled Node.js tools from Python
Use pip to install the latest release from PyPI:
pip install nodely
And don't forget to install Node.js ;)
>>>importnodelyMany great tools are written with JavaScript in Node.js.
It makes sense to use them in Python instead of reinventing the wheel.
nodely provides an API for managing local node_modules/ in Python environments
and running the installed Node.js tools from Python
If the root directory of the current Python environment is:
>>>importsys>>>>>>sys.prefix'C:\\Users\\Zimmermann\\Miniconda3\\envs\\nodely'Then nodely will create:
>>>nodely.NODE_MODULES_DIRPath('C:\\Users\\Zimmermann\\Miniconda3\\envs\\nodely\\node_modules')Please don't modify the above constant, except you exactly know what you are doing ;)
Let's say you want to use the CoffeeScript compiler... Just install the Node.js package:
>>>nodely.install('coffee-script')npm http GET https://registry.npmjs.org/coffee-script
npm http 304 https://registry.npmjs.org/coffee-script
coffee-script@1.12.7 node_modules\coffee-script
It provides the coffee executable. If you want to know its absolute path:
>>>nodely.which('coffee')
Path('C:\\Users\\Zimmermann\\Miniconda3\\envs\\nodely\\node_modules\\.bin\\coffee.CMD')And if you want to run it, for example with the --version flag:
>>>nodely.call('coffee', ['--version'])
0CoffeeScript version 1.12.7
For the case that you want to get rid of the package again,
just nodely.uninstall('coffee-script') it
Instead of installing Node.js packages during runtime, you can also define them as dependencies of your Python package:
fromsetuptoolsimportsetupsetup(
...
setup_requires=['nodely', ...],
require_node_modules=['coffee-script', ...],
...
)So they get implicitly installed during the installation of the Python package,
just like the Python dependencies defined in install_requires
The nodely.call function additionally supports subprocess.call options:
>>>fromsubprocessimportDEVNULL>>>>>>nodely.call('coffee', ['--version'], stdout=DEVNULL)
0And instead of a simple nodely.call,
you can also create a process instance,
and give any subprocess.Popen options to it:
>>>fromsubprocessimportPIPE>>>>>>process=nodely.Popen('coffee', ['--version'], stdout=PIPE,
... universal_newlines=True)>>>process.communicate()[0].split()[-1]
'1.12.7'A more object-oriented approach is provided by:
>>>importnodely.binIt lets you introspect all installed executables with interactive auto-completion
and creates nodely.bin.Command instances:
>>>coffee=nodely.bin.coffeenodely.bin['coffee'] returns the same.
And that nodely.bin.Command instance provides its own .call and a .Popen methods,
and can also be called directly instead of using its .call method:
>>>coffee(['--version'])
0CoffeeScript version 1.12.7
