fr/fr_env/lib/python3.8/site-packages/imageio/__main__.py

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")