¿Cómo puedo construir mis extensiones C con MinGW-w64 en Python?

Por lo tanto, tengo algunas extensiones de Python C que he creado anteriormente y que utilizo en Python de 32 bits que se ejecuta en Win7. Sin embargo, ahora he cambiado a Python de 64 bits, y tengo problemas para construir la extensión C con MinGW-w64.

Hice los cambios en los nombres según esta publicación , pero recibo algunos errores extraños que sugieren que algo está mal:

$ python setup.py build running build running build_ext building 'MyLib' extension c:\MinGW64\bin\x86_64-w64-mingw32-gcc.exe -mdll -O -Wall -Ic:\Python27\lib\site-packages\numpy\core\include -Ic:\Python27\include -Ic:\Python27\PC -c MyLib.c -o build\temp.win-amd64-2.7\Release\mylib.o MyLib.c: In function 'initMyLib': MyLib.c:631:5: warning: implicit declaration of function 'Py_InitModule4_64' [-Wimplicit-function-declaration] writing build\temp.win-amd64-2.7\Release\MyLib.def c:\MinGW64\bin\x86_64-w64-mingw32-gcc.exe -shared -s build\temp.win-amd64-2.7\Release\mylib.o build\temp.win-amd64-2.7\Release\MyLib.def -Lc:\Python27\libs -Lc:\Python27\PCbuild\amd64 -lpython27 -o build\lib.win-amd64-2.7\MyLib.pyd build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x13d): undefined reference to `__imp_PyExc_ValueError' build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x1275): undefined reference to `__imp_PyExc_ValueError' build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x1eef): undefined reference to `__imp_PyExc_ImportError' build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x1f38): undefined reference to `__imp_PyExc_AttributeError' build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x1f4d): undefined reference to `__imp_PyCObject_Type' build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x1f61): undefined reference to `__imp_PyExc_RuntimeError' build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x1fc7): undefined reference to `__imp_PyExc_RuntimeError' build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x1ffe): undefined reference to `__imp_PyExc_RuntimeError' build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x2042): undefined reference to `__imp_PyExc_RuntimeError' build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x206c): undefined reference to `__imp_PyExc_RuntimeError' build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x208a): more undefined references to `__imp_PyExc_RuntimeError' follow build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x20a7): undefined reference to `__imp_PyExc_ImportError' collect2.exe: error: ld returned 1 exit status error: command 'x86_64-w64-mingw32-gcc' failed with exit status 1 

He buscado en Google un poco para encontrar información, pero no es fácil encontrar una respuesta definitiva. ¿Podría alguien arrojar algo de luz sobre esto? ¿Qué otros cambios debo hacer para poder construir con éxito las extensiones C para Python de 64 bits en Win7?

EDITAR:

Después de algunos consejos útiles en los comentarios de cgohlke a continuación, logré generar libpython27.a . Sin embargo, después de seguir los consejos de este post (2do al último) todavía tenía un error __imp_Py_InitModule4_64 . Después de un poco de Google-fu, logré tropezar con esta publicación y me dijo que cambiara el nombre de la línea Py_InitModule4_64 a Py_InitModule4_64 . Después de eso todo funcionó a la perfección.

Esto me funcionó con Python 3.3:

  1. crear estática libia de python desde dll

    Python DLL está generalmente en C: / Windows / System32; en msys shell:

     gendef.exe python33.dll dlltool.exe --dllname python33.dll --def python33.def --output-lib libpython33.a mv libpython33.a C:/Python33/libs 
  2. usa swig para generar envoltorios

    por ejemplo, swig -c++ -python myExtension.i

  3. el envoltorio DEBE comstackrse con MS_WIN64, o su computadora se bloqueará cuando importe la clase en Python

     g++ -c myExtension.cpp -I/other/includes g++ -DMS_WIN64 -c myExtension_wrap.cxx -IC:/Python33/include 
  4. biblioteca compartida

     g++ -shared -o _myExtension.pyd myExtension.o myExtension_wrap.o -lPython33 -lOtherSharedLibs -LC:/Python33/libs -LC:/path/to/other/shared/libs 
  5. asegúrese de que todas las bibliotecas compartidas (gdal, OtherSharedLibs) estén en su PATH (windows no usa LD_LIBRARY_PATH o PYTHONPATH)

  6. en Python, solo: importa mi extensión

voila

Aquí hay un código de ejemplo para VC ++ Build Tools https://github.com/starnight/python-c-extension/tree/master/00-HelloWorld

Tu podrías intentar:

 python setup.py -c mingw32 

Sin embargo, esto no es un trabajo para mí.

Mi solución es:

  1. instala Anaconda 64bit python 3.6

  2. instalar mingw64

  3. agregar mingw64 / bin a PATH
  4. comstackr dll de archivo c por

     gcc -c libmypy.c -IC:\Users\{user_name}\Anaconda3\pkgs\python-3.6.4-h6538335_1\include gcc -shared -o libmypy.dll libmypy.o -LC:\Users\{user_name}\Anaconda3\pkgs\python-3.6.4-h6538335_1\libs -lPython36 
  5. cargar el archivo dll en el script .py

     from ctypes import * m = cdll.LoadLibrary(r"C:\{path_to_dll}\libmypy.dll") print(m.hello())