forked from 170010011/fr
170 lines
5.3 KiB
Python
170 lines
5.3 KiB
Python
|
"""
|
||
|
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. If imageio comes as an .egg, then a cache
|
||
|
# directory will be created by pkg_resources (requires setuptools).
|
||
|
# see `imageio.core.util.resource_dirs`
|
||
|
# and `imageio.core.utilresource_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")
|