mirror of
https://git.datalinker.icu/ltdrdata/ComfyUI-Manager
synced 2025-12-10 06:34:24 +08:00
feat: install pip
This commit is contained in:
parent
dda65d9263
commit
823c8d315b
19
__init__.py
19
__init__.py
@ -20,7 +20,7 @@ import nodes
|
|||||||
import torch
|
import torch
|
||||||
|
|
||||||
|
|
||||||
version = [1, 16]
|
version = [1, 17]
|
||||||
version_str = f"V{version[0]}.{version[1]}" + (f'.{version[2]}' if len(version) > 2 else '')
|
version_str = f"V{version[0]}.{version[1]}" + (f'.{version[2]}' if len(version) > 2 else '')
|
||||||
print(f"### Loading: ComfyUI-Manager ({version_str})")
|
print(f"### Loading: ComfyUI-Manager ({version_str})")
|
||||||
|
|
||||||
@ -1198,6 +1198,7 @@ class GitProgress(RemoteProgress):
|
|||||||
self.pbar.pos = 0
|
self.pbar.pos = 0
|
||||||
self.pbar.refresh()
|
self.pbar.refresh()
|
||||||
|
|
||||||
|
|
||||||
def is_valid_url(url):
|
def is_valid_url(url):
|
||||||
try:
|
try:
|
||||||
result = urlparse(url)
|
result = urlparse(url)
|
||||||
@ -1205,6 +1206,7 @@ def is_valid_url(url):
|
|||||||
except ValueError:
|
except ValueError:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
def gitclone_install(files):
|
def gitclone_install(files):
|
||||||
print(f"install: {files}")
|
print(f"install: {files}")
|
||||||
for url in files:
|
for url in files:
|
||||||
@ -1240,6 +1242,11 @@ def gitclone_install(files):
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def pip_install(packages):
|
||||||
|
install_cmd = ['#FORCE', sys.executable, "-m", "pip", "install", '-U'] + packages
|
||||||
|
try_install_script('pip install via manager', '.', install_cmd)
|
||||||
|
|
||||||
|
|
||||||
import platform
|
import platform
|
||||||
import subprocess
|
import subprocess
|
||||||
import time
|
import time
|
||||||
@ -1430,6 +1437,16 @@ async def install_custom_node_git_url(request):
|
|||||||
return web.Response(status=400)
|
return web.Response(status=400)
|
||||||
|
|
||||||
|
|
||||||
|
@server.PromptServer.instance.routes.get("/customnode/install/pip")
|
||||||
|
async def install_custom_node_git_url(request):
|
||||||
|
res = False
|
||||||
|
if "packages" in request.rel_url.query:
|
||||||
|
packages = request.rel_url.query['packages']
|
||||||
|
pip_install(packages.split(' '))
|
||||||
|
|
||||||
|
return web.Response(status=200)
|
||||||
|
|
||||||
|
|
||||||
@server.PromptServer.instance.routes.post("/customnode/uninstall")
|
@server.PromptServer.instance.routes.post("/customnode/uninstall")
|
||||||
async def uninstall_custom_node(request):
|
async def uninstall_custom_node(request):
|
||||||
json_data = await request.json()
|
json_data = await request.json()
|
||||||
|
|||||||
@ -7,13 +7,13 @@ import { CustomNodesInstaller } from "./custom-nodes-downloader.js";
|
|||||||
import { AlternativesInstaller } from "./a1111-alter-downloader.js";
|
import { AlternativesInstaller } from "./a1111-alter-downloader.js";
|
||||||
import { SnapshotManager } from "./snapshot.js";
|
import { SnapshotManager } from "./snapshot.js";
|
||||||
import { ModelInstaller } from "./model-downloader.js";
|
import { ModelInstaller } from "./model-downloader.js";
|
||||||
import { manager_instance, setManagerInstance, install_via_git_url, rebootAPI } from "./common.js";
|
import { manager_instance, setManagerInstance, install_via_git_url, install_pip, rebootAPI } from "./common.js";
|
||||||
|
|
||||||
var docStyle = document.createElement('style');
|
var docStyle = document.createElement('style');
|
||||||
docStyle.innerHTML = `
|
docStyle.innerHTML = `
|
||||||
#cm-manager-dialog {
|
#cm-manager-dialog {
|
||||||
width: 1000px;
|
width: 1000px;
|
||||||
height: 420px;
|
height: 450px;
|
||||||
box-sizing: content-box;
|
box-sizing: content-box;
|
||||||
z-index: 10000;
|
z-index: 10000;
|
||||||
}
|
}
|
||||||
@ -782,6 +782,18 @@ class ManagerMenuDialog extends ComfyDialog {
|
|||||||
SnapshotManager.instance = new SnapshotManager(app, self);
|
SnapshotManager.instance = new SnapshotManager(app, self);
|
||||||
SnapshotManager.instance.show();
|
SnapshotManager.instance.show();
|
||||||
}
|
}
|
||||||
|
}),
|
||||||
|
$el("button.cm-experimental-button", {
|
||||||
|
type: "button",
|
||||||
|
textContent: "Install PIP packages",
|
||||||
|
onclick:
|
||||||
|
() => {
|
||||||
|
var url = prompt("Please enumerate the pip packages to be installed.\n\nExample: insightface opencv-python-headless>=4.1.1\n", "");
|
||||||
|
|
||||||
|
if (url !== null) {
|
||||||
|
install_pip(url, self);
|
||||||
|
}
|
||||||
|
}
|
||||||
})
|
})
|
||||||
]),
|
]),
|
||||||
];
|
];
|
||||||
|
|||||||
25
js/common.js
25
js/common.js
@ -80,10 +80,35 @@ export function setManagerInstance(obj) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function isValidURL(url) {
|
function isValidURL(url) {
|
||||||
|
if(url.includes('&'))
|
||||||
|
return false;
|
||||||
|
|
||||||
const pattern = /^(https?|ftp):\/\/[^\s/$.?#].[^\s]*$/;
|
const pattern = /^(https?|ftp):\/\/[^\s/$.?#].[^\s]*$/;
|
||||||
return pattern.test(url);
|
return pattern.test(url);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function install_pip(packages) {
|
||||||
|
if(packages.includes('&'))
|
||||||
|
app.ui.dialog.show(`Invalid PIP package enumeration: '${packages}'`);
|
||||||
|
|
||||||
|
const res = await api.fetchApi(`/customnode/install/pip?packages=${packages}`);
|
||||||
|
|
||||||
|
if(res.status == 200) {
|
||||||
|
app.ui.dialog.show(`PIP package installation is processed.<br>To apply the pip packages, please click the <button id='cm-reboot-button'><font size='3px'>RESTART</font></button> button in ComfyUI.`);
|
||||||
|
|
||||||
|
const rebootButton = document.getElementById('cm-reboot-button');
|
||||||
|
const self = this;
|
||||||
|
|
||||||
|
rebootButton.addEventListener("click", rebootAPI);
|
||||||
|
|
||||||
|
app.ui.dialog.element.style.zIndex = 10010;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
app.ui.dialog.show(`Failed to install '${packages}'<BR>See terminal log.`);
|
||||||
|
app.ui.dialog.element.style.zIndex = 10010;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export async function install_via_git_url(url, manager_dialog) {
|
export async function install_via_git_url(url, manager_dialog) {
|
||||||
if(!url) {
|
if(!url) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
@ -410,13 +410,16 @@ if os.path.exists(script_list_path):
|
|||||||
try:
|
try:
|
||||||
script = eval(line)
|
script = eval(line)
|
||||||
|
|
||||||
if script[1].startswith('#'):
|
if script[1].startswith('#') and script[1] != '#FORCE':
|
||||||
if script[1] == "#LAZY-INSTALL-SCRIPT":
|
if script[1] == "#LAZY-INSTALL-SCRIPT":
|
||||||
execute_lazy_install_script(script[0], script[2])
|
execute_lazy_install_script(script[0], script[2])
|
||||||
|
|
||||||
elif os.path.exists(script[0]):
|
elif os.path.exists(script[0]):
|
||||||
if 'pip' in script[1:] and 'install' in script[1:] and is_installed(script[-1]):
|
if script[1] == "#FORCE":
|
||||||
continue
|
del script[1]
|
||||||
|
else:
|
||||||
|
if 'pip' in script[1:] and 'install' in script[1:] and is_installed(script[-1]):
|
||||||
|
continue
|
||||||
|
|
||||||
print(f"\n## ComfyUI-Manager: EXECUTE => {script[1:]}")
|
print(f"\n## ComfyUI-Manager: EXECUTE => {script[1:]}")
|
||||||
print(f"\n## Execute install/(de)activation script for '{script[0]}'")
|
print(f"\n## Execute install/(de)activation script for '{script[0]}'")
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user