Created
November 18, 2014 19:22
-
-
Save emallson/ad7a1d18f0dab4c133d8 to your computer and use it in GitHub Desktop.
Rudimentary NPM-like script for Python (using PIP)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python3 | |
import json | |
import argparse | |
import subprocess | |
import os | |
import pip | |
def find_package_root(): | |
path = os.path.abspath('.') | |
files = [f for f in os.listdir(path) if os.path.isfile(os.path.join(path, f))] | |
while 'package.json' not in files and path != '/': | |
path = os.path.dirname(path) | |
files = [f for f in os.listdir(path) if os.path.isfile(os.path.join(path, f))] | |
if path == '/': | |
raise FileNotFoundError('Unable to locate package.json') | |
return path | |
def load_package(root): | |
with open(os.path.join(root, 'package.json')) as pkgfile: | |
return json.load(pkgfile) | |
package_root = find_package_root() | |
package = load_package(package_root) | |
def install(packages, dest_dir="python_modules"): | |
pip.main(['install', '--target', os.path.join(package_root, "python_modules/")] + [name + version for name,version in package['dependencies'].items()]) | |
def merge_env(new_env): | |
return dict(list(os.environ.items()) + list(new_env.items())) | |
def run(ns): | |
process = subprocess.Popen(['/usr/bin/python3', os.path.join(package_root, package['main'])] + ns.args, | |
env=merge_env({"PYTHONPATH": os.path.join(package_root, "python_modules/")})) | |
process.wait() | |
def main(): | |
parser = argparse.ArgumentParser(description="NPM for Python") | |
command_parsers = parser.add_subparsers(description="") | |
# run [args] | |
run_parser = command_parsers.add_parser('run', help='Run application') | |
run_parser.add_argument("args", nargs=argparse.REMAINDER) | |
run_parser.set_defaults(func=run) | |
# install | |
install_parser = command_parsers.add_parser('install', help='Install dependencies') | |
install_parser.set_defaults(func=install) | |
args = parser.parse_args() | |
args.func(args) | |
if __name__ == "__main__": | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment