Python -> Cython -> C -> DLL -> Работает на Cpp, но не найден модуль - PullRequest
0 голосов
/ 28 мая 2018

У меня есть файл C, он вызывает функцию Python с Cython.

Файл Python имеет факел импорта (Pytorch 0.4.0), а функция использует факел.

Затем я создаю.DLL с этим C-файлом.

Проблема возникает здесь:

Когда я использую эту DLL в файле cpp, он имеет ModuleNotFoundError.

Вот мой простой код:

Environment:
  Windows 10 x64
  Visual Studio 2017
  Anaconda3
  Python 3.6
  Pytorch 0.4.0
  Cython 0.28.2

PyTest.pyx

import torch
cdef public void HelloWorld():
    print('Hello!')
    print(torch.__version__)
    print('World!')

setup.py

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
from Cython.Build import cythonize
setup(name = 'PyTest',
      cmdclass = {'build_ext' : build_ext},
      ext_modules = cythonize('PyTest.pyx')
      )

запустить setup.py в терминале

python setup.py build_ext --inplace

Создать файлы: PyTest.c и PyTest.h

Создание файлов C: C_Test.c и C_Test.h

C_Test.h

#include <Python.h>
#include "PyTest.h"
#include <stdio.h>
#ifdef __cplusplus
extern "C" {
#endif
__declspec(dllexport) int testdll();
#ifdef __cplusplus
}
#endif

C_Test.c

#include "C_Test.h"
int testdll()
{
    Py_Initialize();
    if(Py_IsInitialized())
        printf("Py_Initialize Done!\n");
    if(!PyInit_PyTest())
        printf("PyInit_PyTest Fail!\n");
    HelloWorld();
    Py_Finalize();
    getchar();
    return 0;
}

Командная строка разработчика на 2017 год:

cd "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC"
vcvarsall amd64
cd "{my C files path}"
cl /LD C_Test.c PyTest.c -I C:\Anaconda3\envs\Pytorch\include C:\Anaconda3\envs\Pytorch\libs\python36.lib

Создание C_Test.dll, C_Test.lib, C_Test.exp, C_Test.obj

Затем создайте проект c ++ с помощью Visual Studio 2017 исделайте что-нибудь, чтобы убедиться, что он может прочитать C_Test.dll

CppTest.cpp

#include "stdafx.h"
#include "Python.h"
#include "C_Test.h"
int main()
{
    testdll();
    getchar();
    return 0;
}

Это результат выполнения моей программы:

Py_Initialize Done!
PyInit_PyTest Fail!
Traceback (most recent call last):
  File "PyTest.pyx", line 2, in init PyTest
ModuleNotFoundError: No module named 'torch'

The above exception was the direct cause of the following exception:

SystemError: <built-in method write of _io.TextIOWrapper object at 0x000002C2091877E0> returned a result with an error set
Exception ignored in: 'PyTest.HelloWorld'
SystemError: <built-in method write of _io.TextIOWrapper object at 0x000002C2091877E0> returned a result with an error set
Hello!
...