4 ms·
You could use: import pip pip.main(['install', 'bar'])
by azaras 10y ago
You could use:
import pip
pip.main(['install', 'bar'])
- jonesetc 10y agoPlease don't though.
- networked 10y agoIt's not this simple. That code will only work if you are root or in a virtualenv — and having to create a virtualenv manually contradicts the idea of a self-contained, standalone script that manages dependencies on its own. To install bar as a non-root user you will have to do import pip pip.main(['install', '--user', 'bar']) which throws an error, e.g., if bar is already installed, meaning you will have to wrap the calls to pip.main() in a "try" block and differentiate between the types of errors they throw. The above already makes it noticably less convenient for a script to manage its own dependencies. The killing blow, however, comes form the fact that pip won't let you install multiple versions of the same package in parallel: the most recently installed version overwrites the previous one. This means that a script that relies on a per-user package store can only be safe if it checks the version of every package it uses and replaces it if needed each time it is run. This can a take a long time and is error prone (what if your Internet connection goes down?) but the alternative is simply to deal with the brittleness. I can see this being solved for Python but the solution will probably involve automatically creating and caching per-script virtualenvs. For now, though, something like PyInstaller (i.e., binaries) remains more practical if you want to distribute standalone Python scripts.
- azaras 10y agoI am sorry I made a mistake. You are right. Thanks for the explanation.
- networked 10y agoNo worries!
- raiph 10y agoAiui Perl6's module related design elements allow for this though I don't know if anyone has implemented what you describe. I'll be happy to discuss this further if anyone shows interest.