Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Automatically find the path of the python executable

Tags:

c#

python-3.x

wpf

I'm doing a project that uses python as background script and C# as GUI. My problem is that I can't figure out how to cause my GUI to automatically search for the pythonw.exe file in order to run my python scripts.

Currently I'm using this path:

ProcessStartInfo pythonInfo = new ProcessStartInfo(@"C:\\Users\\Omri\\AppData\\Local\\Programs\\Python\\Python35-32\\pythonw.exe");

but I want it to auto detect the path of pythonw.exe (I need to submit the project and it won't run on others computers unless they change the code itself)

Any suggestions may be helpful.

like image 903
Omri Avatar asked Sep 17 '25 19:09

Omri


2 Answers

Inspired by @Shashi Bhushan's answer I made this function for getting the Python path reliably;

using Microsoft.Win32;
private static string GetPythonPath(string requiredVersion = "", string maxVersion = "")
{
    string[] possiblePythonLocations = new string[3] {
        @"HKLM\SOFTWARE\Python\PythonCore\",
        @"HKCU\SOFTWARE\Python\PythonCore\",
        @"HKLM\SOFTWARE\Wow6432Node\Python\PythonCore\"
    };

    //Version number, install path
    Dictionary<string, string> pythonLocations = new Dictionary<string, string>();

    foreach (string possibleLocation in possiblePythonLocations)
    {
        string regKey = possibleLocation.Substring(0, 4),
               actualPath = possibleLocation.Substring(5);
        RegistryKey theKey = regKey == "HKLM" ? Registry.LocalMachine : Registry.CurrentUser;
        RegistryKey theValue = theKey.OpenSubKey(actualPath);

        foreach (var v in theValue.GetSubKeyNames())
            if (theValue.OpenSubKey(v) is RegistryKey productKey)
                try
                {
                    string pythonExePath = productKey.OpenSubKey("InstallPath").GetValue("ExecutablePath").ToString();
                            
                    // Comment this in to get (Default) value instead
                    // string pythonExePath = productKey.OpenSubKey("InstallPath").GetValue("").ToString();
                            
                    if (pythonExePath != null && pythonExePath != "")
                    {
                        //Console.WriteLine("Got python version; " + v + " at path; " + pythonExePath);
                        pythonLocations.Add(v.ToString(), pythonExePath);
                    }
                }
                catch
                {
                    //Install path doesn't exist
                }
    }

    if (pythonLocations.Count > 0)
    {
        System.Version desiredVersion = new(requiredVersion == "" ? "0.0.1" : requiredVersion);
        System.Version maxPVersion = new(maxVersion == "" ? "999.999.999" : maxVersion);

        string highestVersion = "", highestVersionPath = "";

        foreach (KeyValuePair<string, string> pVersion in pythonLocations)
        {
            //TODO; if on 64-bit machine, prefer the 64 bit version over 32 and vice versa
            int index = pVersion.Key.IndexOf("-"); //For x-32 and x-64 in version numbers
            string formattedVersion = index > 0 ? pVersion.Key.Substring(0, index) : pVersion.Key;

            System.Version thisVersion = new System.Version(formattedVersion);
            int comparison = desiredVersion.CompareTo(thisVersion),
                maxComparison = maxPVersion.CompareTo(thisVersion);

            if (comparison <= 0)
            {
                //Version is greater or equal
                if (maxComparison >= 0)
                {
                    desiredVersion = thisVersion;

                    highestVersion = pVersion.Key;
                    highestVersionPath = pVersion.Value;
                }
                //else
                //    Console.WriteLine("Version is too high; " + maxComparison.ToString());
            }
            //else
            //    Console.WriteLine("Version (" + pVersion.Key + ") is not within the spectrum.");$
        }

        //Console.WriteLine(highestVersion);
        //Console.WriteLine(highestVersionPath);
        return highestVersionPath;
    }

    return "";
}
like image 197
Albert MN. Avatar answered Sep 20 '25 09:09

Albert MN.


You can find python installation path by lookup following keys on windows machine.

HKLM\SOFTWARE\Python\PythonCore\versionnumber\InstallPath

HKCU\SOFTWARE\Python\PythonCore\versionnumber\InstallPath

for win64 bit machine

HKLM\SOFTWARE\Wow6432Node\Python\PythonCore\versionnumber\InstallPath

You can refer this post for how to read registry using C#

How to read value of a registry key c#

like image 29
Shashi Bhushan Avatar answered Sep 20 '25 09:09

Shashi Bhushan