-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathPythonPackageManager.wl
More file actions
68 lines (55 loc) · 2.96 KB
/
PythonPackageManager.wl
File metadata and controls
68 lines (55 loc) · 2.96 KB
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
BeginPackage["PythonPackageManager`"]
PythonVersion::usage = "Gives the version of Python (python --version)"
PythonPackageVersion::usage = "Gives the version of pip (pip --version)"
PythonPackageInformation::usage = "PythonPackageInformation[name] gives the package information for 'name' (pip show name)"
PythonPackageList::usage = "PythonPackageList[] lists all known packages (pip list)"
PythonPackageInstalledQ::usage = "PythonPackageInstalledQ[name] gives True if 'name' is installed, False otherwise"
PythonPackageInstall::usage = "PythonPackageInstall[name] installs 'name' (pip install name)"
PythonPackageUninstall::usage = "PythonPackageUninstall[name] uninstalls 'name' (pip uninstall name)"
Begin["`Private`"]
$tag = "7c704567-e2f5-49a4-ba2e-cba67952b169";
runProcess[args__] := Module[{res = RunProcess[args]},
If[StringQ[res], res, Throw[$Failed,$tag]]
]
PythonVersion[] := Catch[StringTrim[runProcess[{"python", "-V"}, "StandardOutput"]],$tag]
PythonPackageVersion[] := Catch[StringTrim[runProcess[{"pip", "-V"}, "StandardOutput"]],$tag]
PythonPackageInformation[name_String] := Catch[Module[{lines, rules},
lines = ImportString[runProcess[{"pip", "show", name}, "StandardOutput"], "Lines"];
rules = Map[Rule @@ StringSplit[#, ": ", 2] &, lines];
Association @@ rules
], $tag]
PythonPackageList[]:= Catch[Module[{lines,rules},
lines=ImportString[runProcess[{"pip","list"},"StandardOutput"],"Lines"];
rules=Map[Rule@@(StringTrim/@StringSplit[#,WhitespaceCharacter..,2])&,Part[lines,3;;-1]];
Association@@rules
],$tag]
PythonPackageInstalledQ[name_String] := Function[{res}, res =!= $Failed && res =!= ""] @
Catch[runProcess[{"pip", "show", name}, "StandardOutput"],$tag]
PythonPackageInstall::alreadyinstalled="The Python package \"``\" is already installed on this machine.";
PythonPackageInstall[name_String]:= Catch[Module[{},
If[
PythonPackageInstalledQ[name],
Message[PythonPackageInstall::alreadyinstalled,name],
runProcess[{"pip","--quiet","install",name},"StandardOutput"];
If[
PythonPackageInstalledQ[name],
Success["InstallationComplete",<|"MessageTemplate":>"The installation of \"`name`\" is complete.","MessageParameters"-><|"name"->name|>|>],
Failure["InstallationFailed",<|"MessageTemplate":>"The installation of \"`name`\" failed.","MessageParameters"-><|"name"->name|>|>]
]
]
],$tag]
PythonPackageUninstall[name_String, OptionsPattern[]] := Catch[Module[{},
If[
PythonPackageInstalledQ[name],
runProcess[{"pip", "--quiet", "uninstall", "--yes", name}, "StandardOutput"];
If[
PythonPackageInstalledQ[name],
Failure["UninstallationFailed", <|"MessageTemplate" :> "The uninstallation of \"`name`\" failed.","MessageParameters" -> <|"name" -> name|>|>],
Success["UninstallationComplete", <|"MessageTemplate" :> "The uninstallation of \"`name`\" is complete.", "MessageParameters" -> <|"name" -> name|>|>]
]
,
Message[PythonPackageUninstall::notfound, name]
]
],$tag]
End[]
EndPackage[]