| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167 |
- """
- Console scripts and associated helper methods for imageio.
- """
- import argparse
- import os
- from os import path as op
- import shutil
- import sys
- from . import plugins
- from .core import util
- # A list of plugins that require binaries from the imageio-binaries
- # repository. These plugins must implement the `download` method.
- PLUGINS_WITH_BINARIES = ["freeimage"]
- def download_bin(plugin_names=["all"], package_dir=False):
- """Download binary dependencies of plugins
- This is a convenience method for downloading the binaries
- (e.g. for freeimage) from the imageio-binaries
- repository.
- Parameters
- ----------
- plugin_names: list
- A list of imageio plugin names. If it contains "all", all
- binary dependencies are downloaded.
- package_dir: bool
- If set to `True`, the binaries will be downloaded to the
- `resources` directory of the imageio package instead of
- to the users application data directory. Note that this
- might require administrative rights if imageio is installed
- in a system directory.
- """
- if plugin_names.count("all"):
- # Use all plugins
- plugin_names = PLUGINS_WITH_BINARIES
- plugin_names.sort()
- print("Ascertaining binaries for: {}.".format(", ".join(plugin_names)))
- if package_dir:
- # Download the binaries to the `resources` directory of imageio.
- # see `imageio.core.util.resource_dirs`
- # and `imageio.core.util.resource_package_dir`
- directory = util.resource_package_dir()
- else:
- directory = None
- for plg in plugin_names:
- if plg not in PLUGINS_WITH_BINARIES:
- msg = "Plugin {} not registered for binary download!".format(plg)
- raise Exception(msg)
- mod = getattr(plugins, plg)
- mod.download(directory=directory)
- def download_bin_main():
- """Argument-parsing wrapper for `download_bin`"""
- description = "Download plugin binary dependencies"
- phelp = (
- "Plugin name for which to download the binary. "
- + "If no argument is given, all binaries are downloaded."
- )
- dhelp = (
- "Download the binaries to the package directory "
- + "(default is the users application data directory). "
- + "This might require administrative rights."
- )
- example_text = (
- "examples:\n"
- + " imageio_download_bin all\n"
- + " imageio_download_bin freeimage\n"
- )
- parser = argparse.ArgumentParser(
- description=description,
- epilog=example_text,
- formatter_class=argparse.RawDescriptionHelpFormatter,
- )
- parser.add_argument("plugin", type=str, nargs="*", default="all", help=phelp)
- parser.add_argument(
- "--package-dir",
- dest="package_dir",
- action="store_true",
- default=False,
- help=dhelp,
- )
- args = parser.parse_args()
- download_bin(plugin_names=args.plugin, package_dir=args.package_dir)
- def remove_bin(plugin_names=["all"]):
- """Remove binary dependencies of plugins
- This is a convenience method that removes all binaries
- dependencies for plugins downloaded by imageio.
- Notes
- -----
- It only makes sense to use this method if the binaries
- are corrupt.
- """
- if plugin_names.count("all"):
- # Use all plugins
- plugin_names = PLUGINS_WITH_BINARIES
- print("Removing binaries for: {}.".format(", ".join(plugin_names)))
- rdirs = util.resource_dirs()
- for plg in plugin_names:
- if plg not in PLUGINS_WITH_BINARIES:
- msg = "Plugin {} not registered for binary download!".format(plg)
- raise Exception(msg)
- not_removed = []
- for rd in rdirs:
- # plugin name is in subdirectories
- for rsub in os.listdir(rd):
- if rsub in plugin_names:
- plgdir = op.join(rd, rsub)
- try:
- shutil.rmtree(plgdir)
- except Exception:
- not_removed.append(plgdir)
- if not_removed:
- nrs = ",".join(not_removed)
- msg2 = (
- "These plugins files could not be removed: {}\n".format(nrs)
- + "Make sure they are not used by any program and try again."
- )
- raise Exception(msg2)
- def remove_bin_main():
- """Argument-parsing wrapper for `remove_bin`"""
- description = "Remove plugin binary dependencies"
- phelp = (
- "Plugin name for which to remove the binary. "
- + "If no argument is given, all binaries are removed."
- )
- example_text = (
- "examples:\n"
- + " imageio_remove_bin all\n"
- + " imageio_remove_bin freeimage\n"
- )
- parser = argparse.ArgumentParser(
- description=description,
- epilog=example_text,
- formatter_class=argparse.RawDescriptionHelpFormatter,
- )
- parser.add_argument("plugin", type=str, nargs="*", default="all", help=phelp)
- args = parser.parse_args()
- remove_bin(plugin_names=args.plugin)
- if __name__ == "__main__":
- if len(sys.argv) > 1 and sys.argv[1] == "download_bin":
- download_bin_main()
- elif len(sys.argv) > 1 and sys.argv[1] == "remove_bin":
- remove_bin_main()
- else:
- raise RuntimeError("Invalid use of the imageio CLI")
|