2/11/2014

(python study) C Module for using in python using distutils (and Unable to find vcvarsall.bat problem)

The method to make C module for using in python using Visual Studio IDE is introduced on the http://feelmare.blogspot.kr/2014/02/python-study-c-module-for-using-in.html

In this page, I will introduce to make c module using distutils.
The method to use distutils is more simple than VS version.

Firstly, we have to make setup.py file like this.


...
# -*- coding:  cp949 -*-
# python
# install method : setup.py install
# setup.py -help

#from distutils.core import setup, Extension
from distutils.core import setup, Extension
spam_mod = Extension('spam', sources = ['spammodule.c'])
setup (name = "spam",
      version = "1.0",
      description = "A sample extension module",
      ext_modules = [spam_mod],
)
---


type "python setup.py install" on the command line.

Note, python.exe, setup.py, spammodule.c is placed in same folder.

After running, Our .pyd (lib) is made in the python\Lib\site-packages

Now, we can import spam 


!!!
If you meet "unable to find vcvarsall.bat" error, dont be worry, 't is not serious error.
I also meet this error and solve.

The problem is occurred python find vs 9.0 version even though my computer installed vs 11. 
so correct this miss-match.

firstly, try this method 


if you cannot solve error
try this method
open python/Lib/distutils/msvc9compiler.py
and modify code like figure.


I solved this error by second method.

good luck~!!

(python study) C Module for using in python , in Visual Studio

Firstly, I describe to make C module in Visual Studio.

open visual studio
make project -> win32 console application
check DLL, Empty project on setting page




make new .c file and set property 
select Include directories and Library directories on the VC++ Directories page.
In my case, My installed python is located 
Include -> C:\Python33_32\include
Library -> C:\Python33_32\libs  (Caution, not LIB folder)


Notice, my compile option is release, because I have only release version lib(python32.lib),
Python32_d.lib file is not support default. 
If you compile by debug version, you rebuild python source code to debug version by CMake.

programing this source code and compile~!

...
#include "Python.h"

#pragma comment(lib, "python33.lib")          

static PyObject *
 spam_strlen(PyObject *self, PyObject *args)
{
 const char * str = NULL;
 int len = 0; 

 if(!PyArg_ParseTuple(args, "s", &str))
  return NULL;

 //main source code
 len = strlen(str);

 return Py_BuildValue("i", len);
} 

static PyMethodDef SpamMethods[] = { 
 {"strlen", spam_strlen, METH_VARARGS, "count a string length."},
 {NULL, NULL, 0, NULL} //represent end of array
};

static struct PyModuleDef spammodule = {
 PyModuleDef_HEAD_INIT,
 "spam", //name of module
 "It is test module.", //description
 -1,
 SpamMethods
};

PyMODINIT_FUNC PyInit_spam(void)
{
 return PyModule_Create( &spammodule);
}
---

rename ~.dll to spam.pyd
If module name is not matched, cannot use module, error occurred when run in python.


copy spam.pyd into python\LIB folder



In the python, programing following source and run~!

...
import spam
print( spam.strlen( "Hello world") )
---