This repository has been archived by the owner on Nov 10, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 28
/
setup_qiime2.py
136 lines (112 loc) · 4.24 KB
/
setup_qiime2.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
"""Set up Qiime 2 on Google colab.
Do not use this on o local machine, especially not as an admin!
"""
import os
import sys
from subprocess import Popen, PIPE
r = Popen(["pip", "install", "rich"])
r.wait()
from rich.console import Console # noqa
con = Console()
has_conda = "conda version" in os.popen("conda info").read()
has_qiime = "QIIME 2 release:" in os.popen("qiime info").read()
MINICONDA_PATH = (
"https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh"
)
QIIME_YAML_URL = (
"https://data.qiime2.org/distro/core/qiime2-2021.4-py38-linux-conda.yml"
)
QIIME_YAML = os.path.basename(QIIME_YAML_URL)
def cleanup():
"""Remove downloaded files."""
if os.path.exists("Miniconda3-latest-Linux-x86_64.sh"):
os.remove("Miniconda3-latest-Linux-x86_64.sh")
if os.path.exists(QIIME_YAML):
os.remove(QIIME_YAML)
con.log("Cleaned up unneeded files.")
def run_and_check(args, check, message, failure, success, console=con):
"""Run a command and check that it worked."""
console.log(message)
r = Popen(args, env=os.environ, stdout=PIPE, stderr=PIPE,
universal_newlines=True)
o, e = r.communicate()
out = o + e
if r.returncode == 0 and check in out:
console.log("[blue]%s[/blue]" % success)
else:
console.log("[red]%s[/red]" % failure, out)
cleanup()
sys.exit(1)
def _hack_in_the_plugins():
"""Add the plugins to QIIME."""
import qiime2.sdk as sdk
from importlib.metadata import entry_points
pm = sdk.PluginManager(add_plugins=False)
for entry in entry_points()["qiime2.plugins"]:
plugin = entry.load()
package = entry.value.split(':')[0].split('.')[0]
pm.add_plugin(plugin, package, entry.name)
if __name__ == "__main__":
if not has_conda:
run_and_check(
["wget", MINICONDA_PATH],
"saved",
":snake: Downloading miniconda...",
"failed downloading miniconda :sob:",
":snake: Done."
)
run_and_check(
["bash", "Miniconda3-latest-Linux-x86_64.sh", "-bfp", "/usr/local"],
"installation finished.",
":snake: Installing miniconda...",
"could not install miniconda :sob:",
":snake: Installed miniconda to `/usr/local` :snake:"
)
else:
con.log(":snake: Miniconda is already installed. Skipped.")
if not has_qiime:
run_and_check(
["wget", QIIME_YAML_URL],
"saved",
":mag: Downloading Qiime 2 package list...",
"could not download package list :sob:",
":mag: Done."
)
run_and_check(
["conda", "env", "update", "-n", "base", "--file",
"qiime2-2021.4-py38-linux-conda.yml"],
"To activate this environment, use",
":mag: Installing Qiime 2. This may take a little bit.\n :clock1:",
"could not install Qiime 2 :sob:",
":mag: Done."
)
else:
con.log(":mag: Qiime 2 is already installed. Skipped.")
run_and_check(
["qiime", "info"],
"QIIME 2 release:",
":bar_chart: Checking that Qiime 2 command line works...",
"Qiime 2 command line does not seem to work :sob:",
":bar_chart: Qiime 2 command line looks good :tada:"
)
if sys.version_info[0:2] == (3, 8):
sys.path.append("/usr/local/lib/python3.8/site-packages")
con.log(":mag: Fixed import paths to include Qiime 2.")
con.log(":bar_chart: Checking if Qiime 2 import works...")
try:
import qiime2 # noqa
except Exception:
con.log("[red]Qiime 2 can not be imported :sob:[/red]")
sys.exit(1)
con.log("[blue]:bar_chart: Qiime 2 can be imported :tada:[/blue]")
con.log(":bar_chart: Setting up QIIME 2 plugins...")
try:
_hack_in_the_plugins()
from qiime2.plugins import feature_table # noqa
except Exception:
con.log("[red]Could not add the plugins :sob:[/red]")
sys.exit(1)
con.log("[blue]:bar_chart: Plugins are working :tada:[/blue]")
cleanup()
con.log("[green]Everything is A-OK. "
"You can start using Qiime 2 now :thumbs_up:[/green]")