Distutils не вызывает link.exe при использовании WinPython 3.6, но с WinPython 3.5 это работает

Недавно я обновился с Winpython версии 3.5 до соответствующей версии с Python 3.6. Поэтому я должен перекомпилировать свои расширения C, используя новый интерпретатор. Мой сценарий установки выглядит следующим образом:

from distutils.core import setup, Extension
import numpy.distutils.misc_util

c_ext = Extension("heapoperations", ["heapoperations.c"])

setup(
    ext_modules=[c_ext],
    include_dirs=numpy.distutils.misc_util.get_numpy_include_dirs(),
)

Вывод консоли при использовании python 3.5 был

running build_ext
No module named 'numpy.distutils._msvccompiler' in numpy.distutils; trying from distutils
building 'heapoperations' extension
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\amd64\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD -I"C:\Program Files\WinPython-64bit-3.5.1.2\python-3.5.1.amd64\lib\site-packages\numpy\core\include" -I"C:\Program Files\WinPython-64bit-3.5.1.2\python-3.5.1.amd64\include" -I"C:\Program Files\WinPython-64bit-3.5.1.2\python-3.5.1.amd64\include" -I"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE" -I"C:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt" -I"C:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\shared" -I"C:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\um" -I"C:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\winrt" /Tcheapoperations.c /Fobuild\temp.win-amd64-3.5\Release\heapoperations.obj
Found executable C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\amd64\cl.exe
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\amd64\link.exe /nologo /INCREMENTAL:NO /LTCG /DLL /MANIFEST:EMBED,ID=2 /MANIFESTUAC:NO /LIBPATH:"C:\Program Files\WinPython-64bit-3.5.1.2\python-3.5.1.amd64\libs" /LIBPATH:"C:\Program Files\WinPython-64bit-3.5.1.2\python-3.5.1.amd64\PCbuild\amd64" /LIBPATH:"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\LIB\amd64" /LIBPATH:"C:\Program Files (x86)\Windows Kits\10\lib\10.0.10240.0\ucrt\x64" /LIBPATH:"C:\Program Files (x86)\Windows Kits\10\lib\10.0.10240.0\um\x64" /EXPORT:PyInit_heapoperations build\temp.win-amd64-3.5\Release\heapoperations.obj /OUT:D:\MyProject\heapoperations.cp35-win_amd64.pyd /IMPLIB:build\temp.win-amd64-3.5\Release\heapoperations.cp35-win_amd64.lib
Found executable C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\amd64\link.exe

Однако, когда я запускаю тот же скрипт с python 3.6, я получаю

running build_ext
No module named 'numpy.distutils._msvccompiler' in numpy.distutils; trying from distutils
building 'heapoperations' extension
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\x86_amd64\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD -I"C:\Program Files\WinPython-64bit-3.6.0.1Qt5\python-3.6.0.amd64\lib\site-packages\numpy\core\include" -I"C:\Program Files\WinPython-64bit-3.6.0.1Qt5\python-3.6.0.amd64\include" -I"C:\Program Files\WinPython-64bit-3.6.0.1Qt5\python-3.6.0.amd64\include" -I"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE" -I"C:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt" -I"C:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\shared" -I"C:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\um" -I"C:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\winrt" /Tcheapoperations.c /Fobuild\temp.win-amd64-3.6\Release\heapoperations.obj
Found executable C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\x86_amd64\cl.exe

То есть link.exe не вызывается. В результате я не получаю файл .pyd, который позволяет мне использовать код.

Чем можно объяснить поведение? Как заставить все работать под WinPython 3.6?

Я использую 64-битный WinPython под 64-битной Windows 10.


person Samufi    schedule 16.02.2017    source источник
comment
вероятно, это не ответ, но повторите попытку после переименования python._pth, файла рядом с python.exe, как python_nomore._pth   -  person stonebig    schedule 17.02.2017
comment
@stonebig Я уже сделал это. На вопрос это не влияет. Я знаю о вашем ответе на мой предыдущий вопрос stackoverflow.com/questions/42263962/   -  person Samufi    schedule 17.02.2017
comment
хорошо, еще одна глупая идея заключается в том, что существует эффект границы с ранее скомпилированными объектами python-3.5 ... может быть, попробуйте изменить имена ваших файлов, чтобы убедиться, что в вашей системе нет предыдущих объектов?   -  person stonebig    schedule 17.02.2017
comment
@stonebig: К сожалению, переименование ничего не изменило.   -  person Samufi    schedule 17.02.2017
comment
Тогда я не в курсе ... вы не используете Qt4 в своем расширении, не так ли?   -  person stonebig    schedule 17.02.2017
comment
@stonebig: Нет, я не использую Qt4. Я также не думаю, что проблема связана с моим кодом, потому что я не получаю сообщения об ошибке. Distutils ведет себя странно...   -  person Samufi    schedule 17.02.2017
comment
ну и на всякий случай запускаем скрипт\make_cython_use_vc.bat.   -  person stonebig    schedule 18.02.2017


Ответы (1)


Я попробовал с http://dan.iel.fm/posts/python-c-extensions/ (и _chi2.c с https://gist.github.com/douglas-larocca/099bf7460d853abb7c17)

результат:

C:\WinPython\basedir36\buildQt5\winpython-64bit-3.6.x.2\notebooks>python setup.py build_ext --inplace
running build_ext
No module named 'numpy.distutils._msvccompiler' in numpy.distutils; trying from distutils
building '_chi2' extension
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\x86_amd64\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD -IC:\WinPython\basedir36\buildQt5\winpython-64bit-3.6.x.2\python-3.6.0.amd64\lib\site-packages\numpy\core\include -IC:\WinPython\basedir36\buildQt5\winpython-64bit-3.6.x.2\python-3.6.0.amd64\include -IC:\WinPython\basedir36\buildQt5\winpython-64bit-3.6.x.2\python-3.6.0.amd64\include -I"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE" -I"C:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt" -I"C:\Program Files (x86)\Windows Kits\8.1\include\shared" -I"C:\Program Files (x86)\Windows Kits\8.1\include\um" -I"C:\Program Files (x86)\Windows Kits\8.1\include\winrt" /Tc_chi2.c /Fobuild\temp.win-amd64-3.6\Release\_chi2.obj
Found executable C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\x86_amd64\cl.exe
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\x86_amd64\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD -IC:\WinPython\basedir36\buildQt5\winpython-64bit-3.6.x.2\python-3.6.0.amd64\lib\site-packages\numpy\core\include -IC:\WinPython\basedir36\buildQt5\winpython-64bit-3.6.x.2\python-3.6.0.amd64\include -IC:\WinPython\basedir36\buildQt5\winpython-64bit-3.6.x.2\python-3.6.0.amd64\include -I"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE" -I"C:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt" -I"C:\Program Files (x86)\Windows Kits\8.1\include\shared" -I"C:\Program Files (x86)\Windows Kits\8.1\include\um" -I"C:\Program Files (x86)\Windows Kits\8.1\include\winrt" /Tcchi2.c /Fobuild\temp.win-amd64-3.6\Release\chi2.obj
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\x86_amd64\link.exe /nologo /INCREMENTAL:NO /LTCG /DLL /MANIFEST:EMBED,ID=2 /MANIFESTUAC:NO /LIBPATH:C:\WinPython\basedir36\buildQt5\winpython-64bit-3.6.x.2\python-3.6.0.amd64\libs /LIBPATH:C:\WinPython\basedir36\buildQt5\winpython-64bit-3.6.x.2\python-3.6.0.amd64\PCbuild\amd64 /LIBPATH:"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\LIB\amd64" /LIBPATH:"C:\Program Files (x86)\Windows Kits\10\lib\10.0.10240.0\ucrt\x64" /LIBPATH:"C:\Program Files (x86)\Windows Kits\8.1\lib\winv6.3\um\x64" /EXPORT:PyInit__chi2 build\temp.win-amd64-3.6\Release\_chi2.obj build\temp.win-amd64-3.6\Release\chi2.obj /OUT:C:\WinPython\basedir36\buildQt5\winpython-64bit-3.6.x.2\notebooks\_chi2.cp36-win_amd64.pyd /IMPLIB:build\temp.win-amd64-3.6\Release\_chi2.cp36-win_amd64.lib
Found executable C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\x86_amd64\link.exe

C:\WinPython\basedir36\buildQt5\winpython-64bit-3.6.x.2\notebooks>

проверка результата:

PS C:\WinPython\basedir36\buildQt5\winpython-64bit-3.6.x.2\notebooks> python
Python 3.6.0 (v3.6.0:41df79263a11, Dec 23 2016, 08:06:12) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import _chi2; print (_chi2.chi2(2.0, 1.0, [-1.0, 4.2, 30.6], [-1.5, 8.0, 63.0], [1.0, 1.5, 0.6]))
2.8988888888888766
person stonebig    schedule 17.02.2017