Как скомпилировать расширение C для Python 3.7 в Windows - PullRequest
0 голосов
/ 06 апреля 2019

Я пытаюсь скомпилировать файл C для использования в Python.Файл является решателем для дифференциальных алгебраических уравнений (DAE).Моя проблема заключается в том, что при компиляции файла setup.py я получаю сообщение об ошибке «Не удается открыть исходный файл:« daesolver.c »: такого файла или каталога нет.Поскольку файл C довольно сложный, я попытался сделать то же самое с более простым примером.Я использовал пример HelloWorld, предоставленный Эллиотом Форбсом, в (https://tutorialedge.net/python/python-c-extensions-tutorial/). Даже с этой очень простой функцией я получаю ту же ошибку. Вот полный вывод, который я получаю от команды построения.

C:\Users\Administrator>python c:\temp\teste_C2py\setup.py build
running build
running build_ext
building 'myModule' extension
C:\Program Files (x86)\Microsoft Visual 
Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\HostX86\x64\cl.exe /c 
/nolog
o /Ox /W3 /GL /DNDEBUG /MD -IC:\ProgramData\Anaconda3\include - 
IC:\ProgramData\Anaconda3\include "-IC:\Program Files (x8
6)\Microsoft Visual 
Studio\2017\Community\VC\Tools\MSVC\14.16.27023\ATLMFC\include" "- 
IC:\Program Files (x86)\Microsoft
Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\include" "- 
IC:\Program Files (x86)\Windows Kits\10\include\10.0.1
7763.0\ucrt" "-IC:\Program Files (x86)\Windows 
Kits\10\include\10.0.17763.0\shared" "-IC:\Program Files (x86)\Windows Ki
ts\10\include\10.0.17763.0\um" "-IC:\Program Files (x86)\Windows 
Kits\10\include\10.0.17763.0\winrt" "-IC:\Program Files
(x86)\Windows Kits\10\include\10.0.17763.0\cppwinrt" /Tctest.c 
/Fobuild\temp.win-amd64-3.7\Release\test.obj
test.c
c1: fatal error C1083: Cannot open source file: 'test.c': No such file or 
directory
error: command 'C:\\Program Files (x86)\\Microsoft Visual 
Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\Ho
stX86\\x64\\cl.exe' failed with exit status 2

Вот файл test.c

#include <Python.h>

// Function 1: A simple 'hello world' function
static PyObject* helloworld(PyObject* self, PyObject* args)
{
    printf("Hello World\n");
    return Py_None;
}

// Our Module's Function Definition struct
// We require this `NULL` to signal the end of our method
// definition
static PyMethodDef myMethods[] = {
    { "helloworld", helloworld, METH_NOARGS, "Prints Hello World" },
    { NULL, NULL, 0, NULL }
};

// Our Module Definition struct
static struct PyModuleDef myModule = {
    PyModuleDef_HEAD_INIT,
    "myModule",
    "Test Module",
    -1,
    myMethods
};

// Initializes our module using our above struct
PyMODINIT_FUNC PyInit_myModule(void)
{
    return PyModule_Create(&myModule);
}

, а вот файл setup.py

from distutils.core import setup, Extension
setup(name = 'myModule', version = '1.0',  \
   ext_modules = [Extension('myModule', ['test.c'])])

, оба файла находятся в одной папке c: \ temp \ teste_C2py.

Я использую Python 3.7 в дистрибутиве Anaconda 64 бита (я также хочу сделать то же самое для x86).

Я установил в той же среде Visual Studio 2017 (сообщество) со всем компиляторомпо необходимости (по крайней мере, я так думаю).

Что действительно странно, так это то, что меня заставили делать это, когда я устанавливал только vs build tools 2017 в виртуальной машине, но когда я пытался повторить то же самое вэта машина выдает мне эту ошибку. Я также испортил среду, в которой я впервые выполнил эту работу, и теперь я не могу сделать это снова.

Я также настроил переменные среды VS150COMNTOOLS = C: \ ProgramFiles (x86) \ Microsoft Visual Studio \ 2017 \ Community \ Common7 \ Tools

Кажется, что мне не хватает somenthing в конфигурации Visual Studio, потому что нет смысла не находить файл в той же папке.

1 Ответ

0 голосов
/ 07 апреля 2019

Я нашел проблему. Как это было раньше, это было очень глупо. Я пытался запустить скрипт установки из папки, где находится python.exe (потому что у меня на компьютере установлены разные версии Python). Но если вместо этого я перехожу в папку, где находится файл setup.py, и запускаю coomand без какого-либо пути, прежде чем setup.py, сборка работает! Я понятия не имею, почему относительный путь здесь не работает. Я надеюсь, что это может помочь!

...