У меня есть файл 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!