hello,
here an updated code
# More info here
# https://github-wiki-see.page/m/DynamoDS/Dynamo/wiki/Customizing-Dynamo%27s-Python-3-installation
import sys
import clr
import System
import re
print('\n'.join(sys.path))
pyEngineName = sys.implementation.name
clr.AddReference("System.Windows.Forms")
import System.Windows.Forms
from System.Windows.Forms import MessageBox, MessageBoxButtons, MessageBoxIcon
from System.Reflection import Assembly
dynamo = Assembly.Load('DynamoCore')
dynamo_version = str(dynamo.GetName().Version)
dynamo_version = tuple(int(x) for x in dynamo_version.split("."))
print('dynamo_version', dynamo_version)
init_setup = False
if pyEngineName != "ironpython" and dynamo_version > (2,8,0,0):
#reDir = System.IO.DirectoryInfo(re.__file__)
#path_py3_lib = reDir.Parent.Parent.FullName
clr.AddReference('Python.Included')
import Python.Included as pyInc
path_py3_lib = pyInc.Installer.EmbeddedPythonHome
#sys.path.append(path_py3_lib + r'\Lib\site-packages')
import platform, os, subprocess, importlib.util
from System import Environment
from System.Net import WebClient
#
# get paths
assert os.path.isdir(path_py3_lib)
pipDirPath = os.path.join(path_py3_lib, 'Scripts')
pipfilePath = pipDirPath + "\\pip"
get_pip_path = os.path.join(path_py3_lib, 'get-pip.py')
site_packagepath = os.path.join(path_py3_lib, 'Lib\site-packages')
#assert os.path.isdir(site_packagepath), "Error folder {} not found".format(site_packagepath)
#
if not os.path.isfile(get_pip_path):
client = WebClient()
client.DownloadFile('https://bootstrap.pypa.io/get-pip.py', get_pip_path)
filepy_pth = f'python{sys.version_info.major}{sys.version_info.minor}._pth'
pthFilePath = os.path.join(path_py3_lib, filepy_pth)
assert os.path.isfile(pthFilePath), "Error file {} not found".format(pthFilePath)
with open(pthFilePath, 'r+') as f:
lines = f.readlines()
if re.match(r'#import site', lines[-1]) is not None:
lines[-1] = re.sub(r'#', '', lines[-1])
f.writelines(lines)
if not os.path.isdir(pipDirPath):
#print(f'installing pip in local Python environment: {path_py3_lib}')
print('installing pip in local Python environment: {}'.format(path_py3_lib))
subprocess.Popen(["python", get_pip_path])
# try to update pip
try:
#subprocess.run(['python', '-m', pipfilePath, 'install', '--upgrade pip'], cwd = path_py3_lib)
subprocess.Popen(["python", '-m', pipfilePath, 'install', '--upgrade pip'], cwd = path_py3_lib)
except Exception as ex:
print(str(ex))
init_setup = True
MessageBox.Show("Initialization in Progress...\nWhen installation finished, close Dynamo and relaunch this script to install packages", "Initialization In Progress...", MessageBoxButtons.OK, MessageBoxIcon.Warning)
raise Exception("close Dynamo and relaunch this script to install packages")
else:
print('pip was already installed for this local Python environment')
init_setup = False
#
installPackages = IN[0]
if installPackages and not init_setup:
sys.path.append(site_packagepath)
for packageName in installPackages:
spec = importlib.util.find_spec( packageName )
if spec is None:
try:
subprocess.run([pipfilePath, 'install', '--target='+ site_packagepath, packageName], cwd = path_py3_lib)
print('{} succesfully installed'.format(packageName))
except Exception as ex:
#print(f'error while installing {packageName}')
print('error while installing {}'.format(packageName))
print(str(ex))
else:
#print(f"package {packageName} is already installed")
print("package {} is already installed".format(packageName))
# check result
if False:
import numpy as np
import pandas as pd
MessageBox.Show("Python installation and configuration completed successfully!", "Installation Python", MessageBoxButtons.OK, MessageBoxIcon.Information)
elif pyEngineName == "ironpython" and dynamo_version > (2,8,0,0):
MessageBox.Show("Switch to CPython3 then relaunch the script!", "Installation Python", MessageBoxButtons.OK, MessageBoxIcon.Warning)
else:
MessageBox.Show("Python installation and configuration completed successfully!", "Installation Python", MessageBoxButtons.OK, MessageBoxIcon.Information)