Merge pull request #165 from LucianoCirino/Use-sys.executable-for-Pip-Calls

Use sys.executable for Pip Calls
This commit is contained in:
TSC
2023-09-10 17:38:28 -05:00
committed by GitHub

View File

@@ -472,10 +472,11 @@ def global_preview_method():
#----------------------------------------------------------------------------------------------------------------------- #-----------------------------------------------------------------------------------------------------------------------
# Auto install Efficiency Nodes Python package dependencies # Auto install Efficiency Nodes Python package dependencies
import subprocess import subprocess
# Note: Auto installer install packages inside the requirements.txt. # Note: This auto-installer installs packages listed in the requirements.txt.
# It first trys ComfyUI's python_embedded folder if python.exe exists inside ...\ComfyUI_windows_portable\python_embeded. # It first checks if python.exe exists inside the ...\ComfyUI_windows_portable\python_embeded directory.
# If no python.exe is found, it attempts a general global pip install of packages. # If python.exe is found in that location, it will use this embedded Python version for the installation.
# On an error, an user is directed to attempt manually installing the packages themselves. # Otherwise, it uses the Python interpreter that's currently executing the script (via sys.executable) to attempt a general pip install of the packages.
# If any errors occur during installation, the user is directed to manually install the required packages.
def install_packages(my_dir): def install_packages(my_dir):
# Compute path to the target site-packages # Compute path to the target site-packages
@@ -483,7 +484,7 @@ def install_packages(my_dir):
embedded_python_exe = os.path.abspath(os.path.join(my_dir, '..', '..', '..', 'python_embeded', 'python.exe')) embedded_python_exe = os.path.abspath(os.path.join(my_dir, '..', '..', '..', 'python_embeded', 'python.exe'))
# If embedded_python_exe exists, target the installations. Otherwise, go untargeted. # If embedded_python_exe exists, target the installations. Otherwise, go untargeted.
use_embedded = os.path.exists(embedded_python_exe) use_embedded = os.path.exists(embedded_python_exe) and embedded_python_exe == sys.executable
# Load packages from requirements.txt # Load packages from requirements.txt
with open(os.path.join(my_dir, 'requirements.txt'), 'r') as f: with open(os.path.join(my_dir, 'requirements.txt'), 'r') as f:
@@ -496,12 +497,15 @@ def install_packages(my_dir):
if pkg not in installed_packages: if pkg not in installed_packages:
printout = f"Installing required package '{pkg}'..." printout = f"Installing required package '{pkg}'..."
print(f"{message('Efficiency Nodes:')} {printout}", end='', flush=True) print(f"{message('Efficiency Nodes:')} {printout}", end='', flush=True)
if use_embedded: # Targeted installation if use_embedded: # Targeted installation
subprocess.check_call(['pip', 'install', pkg, '--target=' + target_dir, '--no-warn-script-location', subprocess.check_call([embedded_python_exe, '-m', 'pip', 'install', pkg, '--target=' + target_dir,
'--disable-pip-version-check'], stdout=subprocess.DEVNULL, '--no-warn-script-location', '--disable-pip-version-check'],
stderr=subprocess.PIPE) stdout=subprocess.DEVNULL, stderr=subprocess.PIPE)
else: # Untargeted installation else: # Untargeted installation
subprocess.check_call(['pip', 'install', pkg], stdout=subprocess.DEVNULL, stderr=subprocess.PIPE) subprocess.check_call([sys.executable, "-m", "pip", 'install', pkg],
stdout=subprocess.DEVNULL, stderr=subprocess.PIPE)
print(f"\r{message('Efficiency Nodes:')} {printout}{success('Installed!')}", flush=True) print(f"\r{message('Efficiency Nodes:')} {printout}{success('Installed!')}", flush=True)
except Exception as e: # This catches all exceptions derived from the base Exception class except Exception as e: # This catches all exceptions derived from the base Exception class
@@ -513,7 +517,8 @@ def packages(python_exe=None, versions=False):
return [(r.decode().split('==')[0] if not versions else r.decode()) for r in return [(r.decode().split('==')[0] if not versions else r.decode()) for r in
subprocess.check_output([python_exe, '-m', 'pip', 'freeze']).split()] subprocess.check_output([python_exe, '-m', 'pip', 'freeze']).split()]
else: else:
return [(r.split('==')[0] if not versions else r) for r in subprocess.getoutput('pip freeze').splitlines()] return [(r.split('==')[0] if not versions else r) for r in
subprocess.getoutput([sys.executable, "-m", "pip", "freeze"]).splitlines()]
except subprocess.CalledProcessError as e: except subprocess.CalledProcessError as e:
raise e # re-raise the error to handle it outside raise e # re-raise the error to handle it outside