Skip to content

Instantly share code, notes, and snippets.

@emallson
Created November 18, 2014 19:22
Show Gist options
  • Save emallson/ad7a1d18f0dab4c133d8 to your computer and use it in GitHub Desktop.
Save emallson/ad7a1d18f0dab4c133d8 to your computer and use it in GitHub Desktop.
Rudimentary NPM-like script for Python (using PIP)
#!/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