skip to Main Content

I have a very simple C# app using Python.net 3.0.3 on net8.0 that is attempting to call out to a Python module in the bin/Debug/net8.0 directory, which returns the product of two numbers. On Windows it works, on Ubuntu I receive a Python.Runtime.PythonException with message No module named 'script'. The files on both machines are the same.

Code:

namespace PythonLoader
{
    using System;
    using System.Runtime.InteropServices;
    using GetSomeInput;
    using Python.Runtime;

    public class Program
    {
        public static void Main(string[] args)
        {
            try
            {
                string script = Inputty.GetString("Module name: ", "script", false);

                if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
                {
                    Runtime.PythonDLL = @"C:Python312python312.dll";
                }
                else
                {
                    // see https://stackoverflow.com/questions/20582270/distribution-independent-libpython-path
                    Runtime.PythonDLL = @"/usr/lib/x86_64-linux-gnu/libpython3.10.so";
                }

                PythonEngine.Initialize();
                PythonEngine.BeginAllowThreads();

                Console.WriteLine("Using Python DLL      : " + Runtime.PythonDLL);
                Console.WriteLine("Using Python version  : " + PythonEngine.Version);
                Console.WriteLine("Build information     : " + PythonEngine.BuildInfo);
                Console.WriteLine("Compiler              : " + PythonEngine.Compiler);
                Console.WriteLine("Max supported version : " + PythonEngine.MaxSupportedVersion);
                Console.WriteLine("Min supported version : " + PythonEngine.MinSupportedVersion);
                Console.WriteLine("Platform              : " + PythonEngine.Platform);
                Console.WriteLine("Program name          : " + PythonEngine.ProgramName);
                Console.WriteLine("Python home           : " + PythonEngine.PythonHome);
                Console.WriteLine("Python path           : " + PythonEngine.PythonPath);

                using (Py.GIL())
                {
                    dynamic app = Py.Import(script);
                    Console.WriteLine(app.multiply(2, 4));
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }
    }
}

File script.py

def multiply(a, b):
  return a * b

File __init__.py

from script import multiply

Both of these files are copied to the output directory (e.g. bin/Debug/net8.0.

Works on Windows:

C:CodeMiscPythonLoaderPythonLoaderbinDebugnet8.0>pythonloader
Module name:  [script]
Using Python DLL      : C:Python312python312.dll
Using Python version  : 3.12.2 (tags/v3.12.2:6abddd9, Feb  6 2024, 21:26:36) [MSC v.1937 64 bit (AMD64)]
Build information     : tags/v3.12.2:6abddd9, Feb  6 2024, 21:26:36
Compiler              : [MSC v.1937 64 bit (AMD64)]
Max supported version : 3.12.2147483647.2147483647
Min supported version : 3.7
Platform              : win32
Program name          : python
Python home           :
Python path           : C:Python312python312.zip;C:Python312DLLs;C:Python312Lib;C:CodeMiscPythonLoaderPythonLoaderbinDebugnet8.0
8

Fails on Ubuntu:

joel@ubuntu:~/Code/pythontest/bin/Debug/net8.0$ ./pythontest
Python filename:  [script.py] 
Using Python DLL      : /usr/lib/x86_64-linux-gnu/libpython3.10.so
Using Python version  : 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0]
Build information     : main, Nov 20 2023, 15:14:05
Compiler              : [GCC 11.4.0]
Max supported version : 3.12.2147483647.2147483647
Min supported version : 3.7
Platform              : linux
Program name          : python3
Python home           : 
Python path           : /usr/lib/python310.zip:/usr/lib/python3.10:/usr/lib/python3.10/lib-dynload:/home/joel/Code/pythontest/bin/Debug/net8.0
Python.Runtime.PythonException: No module named 'script'
   at Python.Runtime.PythonException.ThrowLastAsClrException()
   at Python.Runtime.NewReferenceExtensions.BorrowOrThrow(NewReference& reference)
   at Python.Runtime.PyModule.Import(String name)
   at Python.Runtime.Py.Import(String name)
   at PythonLoader.Program.Main(String[] args) in /home/joel/Code/pythontest/Program.cs:line 59

Directory contents on Windows:

C:CodeMiscPythonLoaderPythonLoaderbinDebugnet8.0>dir
 Volume in drive C is OS
 Volume Serial Number is 541C-D54E

 Directory of C:CodeMiscPythonLoaderPythonLoaderbinDebugnet8.0

05/24/2024  08:34 PM    <DIR>          .
05/24/2024  09:07 AM    <DIR>          ..
01/11/2024  11:37 AM           322,048 GetSomeInput.dll
10/11/2023  12:15 AM           431,616 Python.Runtime.dll
05/24/2024  02:32 PM             7,378 PythonLoader.deps.json
05/24/2024  08:34 PM             6,656 PythonLoader.dll
05/24/2024  08:34 PM           142,848 PythonLoader.exe
05/24/2024  08:34 PM            10,932 PythonLoader.pdb
05/24/2024  09:17 AM               268 PythonLoader.runtimeconfig.json
05/24/2024  09:16 AM                37 script.py
05/24/2024  03:40 PM                29 __init__.py
05/24/2024  09:21 AM    <DIR>          __pycache__
               9 File(s)        921,812 bytes
               3 Dir(s)  48,029,245,440 bytes free

Directory contents on Ubuntu:

joel@ubuntu:~/Code/pythontest/bin/Debug/net8.0$ ls -la
total 860
drwxrwxr-x 2 joel joel   4096 May 24 20:33 .
drwxrwxr-x 3 joel joel   4096 May 24 15:41 ..
-rwxrw-r-- 1 joel joel 322048 Jan 11 10:32 GetSomeInput.dll
-rw-rw-r-- 1 joel joel     31 May 24 15:52 __init__.py
-rwxrw-r-- 1 joel joel 431616 Oct 11  2023 Python.Runtime.dll
-rwxr-xr-x 1 joel joel  72448 May 24 20:33 pythontest
-rw-rw-r-- 1 joel joel   7171 May 24 15:41 pythontest.deps.json
-rw-rw-r-- 1 joel joel   6656 May 24 20:33 pythontest.dll
-rw-rw-r-- 1 joel joel  10964 May 24 20:33 pythontest.pdb
-rw-rw-r-- 1 joel joel    257 May 24 15:41 pythontest.runtimeconfig.json
-rw-rw-r-- 1 joel joel     38 May 24 20:31 script.py

Any help would be much appreciated!

Edit: added more logging for verbosity and clarity.

2

Answers


  1. Python does not search for imports in current directory by default.

    Login or Signup to reply.
  2. Your script.py and __init__.py appear to be different on different platforms. Do you even need __init__.py?

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search