Step-by-step instructions. This assumes you have the source and are building a single DLL extension that links the source directly into it. I didn't go back through it after creating a working project, so I may have missed something. Comment on this post if you get stuck on a step. If you have an existing DLL and want to create a Python extension DLL that wraps it, this steps are slightly different. If you need help with that comment on this post and I will extend it.
Edit 8/19/2012: If starting with a C example, don't use -c++
in step 13 and use .c
instead of .cxx
for the wrap file extension in steps 14 and 19.
- Start Visual Studio 2010
- File, New, Project from Existing Code...
- Select "Visual C++" project type and click Next.
- Enter project file location where the .cpp/.h/.i files are.
- For Project Name, choose the name used in %module statement in your .i file (case matters).
- Select project type "Dynamically linked library (DLL) project" and click Next.
- Add to Include search paths the path to the Python.h file, usually something like "C:\Python27\include" and click Next.
- Click Finish.
- Right-click the Project in Solution Explorer, Add, Existing Item..., and select your .i file.
- Right-click the .i file, Properties, and select Configuration "All Configurations".
- Change Item Type to "Custom Build Tool" and click Apply.
- Select "Custom Build Tool" in Properties (it will appear after Apply above).
- Enter Command Line of "swig -c++ -python -outdir $(Outdir) %(Identity)" (this assumes SWIG is in your path and redirects the generated .py file to the Debug or Release directory as needed).
- In Outputs enter "%(Filename)_wrap.cxx;$(Outdir)%(Filename).py".
- Click OK.
- Right-click the .i file, and select Compile.
- Right-click the project, Add, New Filter, name it "Generated Files".
- Right-click "Generated Files", click Properties, and set "SCC Files" to "False" (if you use source-control, this prevents VS2010 trying to check in the generated files in this filter).
- Right-click "Generated Files", Add, Exiting Item and select the _wrap.cxx file that was generated by the compile.
- Right-click the project, Properties.
- Select Configuration "All Configurations".
- Select Configuration Properties, Linker, General, Additional Library Directories and add the path to the python libraries, typically "C:\Python27\libs".
- Select Configuration Properties, General and set TargetName to "_$(ProjectName)".
- Set Target Extension to ".pyd".
- Build the "Release" version of the project. You can't build the Debug version unless you build a debug version of Python itself.
- Open a console, go to the Release directory of the project, run python, import your module, and call a function!