Unity3D: (Python.net) PythonException: ModuleNotFoundError - PullRequest
0 голосов
/ 18 октября 2019

Я пытаюсь вызвать класс Python из моего файла C # в Unity3d. Модули Numpy и OS работают нормально.

 void Start()
    {
        startTime = Time.time;

        using (Py.GIL())
        {
            dynamic np = Py.Import("numpy");
            UnityEngine.Debug.Log(np.cos(np.pi * 2));

            dynamic sin = np.sin;
            UnityEngine.Debug.Log(sin(5));

            double c = np.cos(5) + sin(5);
            UnityEngine.Debug.Log(c);

            dynamic a = np.array(new List<float> { 1, 2, 3 });
            UnityEngine.Debug.Log(a.dtype);

            dynamic b = np.array(new List<float> { 6, 5, 4 }, dtype: np.int32);
            UnityEngine.Debug.Log(b.dtype);

            UnityEngine.Debug.Log(a * b);
            dynamic os = Py.Import("os");
            UnityEngine.Debug.Log(os.getcwd());

            dynamic test = Py.Import("clrTest"); // this throws me an error
        }
    }

clrTest - мой пользовательский класс clrTest.py

class clsMyTest:
    """clsTest.clsMyTest class"""

    @staticmethod
    def Test03():
        return 42

    def Test04():
        return 42

def Test01():
    return 42

@staticmethod
def Test02():
    return 42

Я получаю следующую ошибку

PythonException: ModuleNotFoundError : No module named 'clrTest'
Python.Runtime.Runtime.CheckExceptionOccurred () (at <38fa310f96774b388b3fb5f7d3ed5afc>:0)
Python.Runtime.PythonEngine.ImportModule (System.String name) (at <38fa310f96774b388b3fb5f7d3ed5afc>:0)
Python.Runtime.Py.Import (System.String name) (at <38fa310f96774b388b3fb5f7d3ed5afc>:0)

Я попытался разместитьмой файл python в том же каталоге, что и файл c #, в корневом каталоге и в модуле установки плагинов. Тем не менее я получаю эту ошибку. Что делать?

1 Ответ

0 голосов
/ 30 октября 2019

Pythonnet Py.Import () ведет себя так же, как Python оператор "import". Чтобы модуль был успешно импортирован, модуль должен находиться в одном из местоположений пути поиска интерпретатора Python. Путь поиска интерпретатора зависит от платформы и может быть изменен. Подробности см. В документации по Python: Изменение пути поиска Python .

В Windows я обычно прибегаю к одному из двух вариантов:

  1. Изменить переменную среды PYTHONPATH для управляемого процесса:

    Environment.SetEnvironmentVariable("PYTHONPATH", @"D:\MyPythonModules\", EnvironmentVariableTarget.Process);  
    
  2. Изменить sys.path Python , выполнив строку кода Python с pythonnet:

        using (Py.GIL())
        {
            int returnValue = PythonEngine.RunSimpleString("import sys;sys.path.insert(1, 'D:/MyPythonModules/');");
            if (returnValue != 0)
            {
                 //throw exception or other failure handling
            }
        }
    

Преимущество использования этих параметров перед другими, перечисленными в документации по Python, заключается в том, что вы не изменяете установку Python. Второй вариант также будет работать с встраиваемым Python , который игнорирует переменные окружения. Преимущество изменения PYTHONPATH только для конкретного процесса состоит в том, что вы не влияете на другие процессы в системе. Однако, если вам нужно только что-то быстро протестировать, вы можете напрямую изменить системную переменную окружения PYTHONPATH.

...