-
Notifications
You must be signed in to change notification settings - Fork 26
Description
On macOS with pythonnet 3.0.0a2 installed (clr-loader 0.1.7) but without .NET core installed:
- Open a terminal window
- Download and install the correct .NET runtime (by double clicking the installer in Finder)
- In the same terminal window, run a Python script that has:
get_coreclr(C:\MyApp.runtimeconfig.json)
This results in the following exception:
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/MyPackage/my_script.py", line 28, in <module>
runtime_config_path = get_coreclr(r'C:\MyApp.runtimeconfig.json')
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/clr_loader/__init__.py", line 42, in get_coreclr
dotnet_root = find_dotnet_root()
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/clr_loader/util/find.py", line 22, in find_dotnet_root
raise RuntimeError("Can not determine dotnet root")
RuntimeError: Can not determine dotnet root
If a NEW Terminal window is opened then this error does not occur. However we should not have to open a new Terminal window for it to find the dotnet executable. Performing the same steps on Windows works fine - we don't need to open a new command window.
My application has the prerequisites that pythonnet and .NET runtime are first installed. I am getting reports from people that they have installed the prerequisites but it is still failing. They don't realise that they need to open a new Terminal window to get it working.
The reason for the exception seems to be in clr-loader/util/find.py there is a difference how it finds the "dotnet" executable between Windows and macOS:
- Windows just looks in C:\Program Files\dotnet
- On macOS however, the line
dotnet_path = shutil.which("dotnet")
doesn't find anything because dotnet is not in the path for this Terminal window.
def find_dotnet_root() -> str:
dotnet_root = os.environ.get("DOTNET_ROOT", None)
if dotnet_root is not None:
return dotnet_root
if sys.platform == "win32":
# On Windows, the host library is stored separately from dotnet.exe for x86
prog_files = os.environ.get("ProgramFiles")
dotnet_root = os.path.join(prog_files, "dotnet")
if os.path.isdir(dotnet_root):
return dotnet_root
# Try to discover dotnet from PATH otherwise
dotnet_path = shutil.which("dotnet")
if not dotnet_path:
raise RuntimeError("Can not determine dotnet root")
To fix this, could macOS just look in /usr/local/share/dotnet ?
(I'm don't have Linux so I'm not sure where dotnet gets installed to on Linux)