  | 
   Python With C++ 
   Submitted by  |   
  
  
Hi ,this is a little example that shows how to use python with c++. 
Example usage:
   PyVM vm;  
   print  mod("foo");
   vm.Init(argv[0]);    
   vm.RegiterMod(mod);   
   std::string cmd =  "                                   \n"
                      "import foo;                        \n"
                      "foo.mega_print(\"py@exe  HI HII!! \");      ";
      vm.ExecString(cmd.c_str());
    vm.ExecFile("file.py");  |  
  
 
  Javier Santana  ^ ethernet 
 | 
 
 
 
Currently browsing [py.zip] (32,340 bytes) - [py.cpp] - (2,070 bytes)
 
 // py.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
  
/////////////////////
//
// - PyModule
//
/////////////////////
PyModule::~PyModule()
{
			
		std::vector <PyMethodDef>::iterator i =  methods.begin();
		for(;i!=methods.end();++i){
				if((*i).ml_name) delete [] (*i).ml_name;
					
		}
  			
}
void PyModule::RegisterMethod(const char *name, PyCallback fn)
{	
			// :((
			int len = strlen(name);
			char *p = new char[strlen(name)+1];
			strcpy(p,name);
			p[len]=0;
			PyMethodDef def = 
					{ 
						p,	          //name
						fn,           //callback
						METH_VARARGS, //callback method
						NULL		  // ;**
					};
			methods.push_back(def);
}
  /////////////////////
//
// - PyVM
//
/////////////////////
  bool PyVM::Init(const char *n)
{
			End();
			Py_SetProgramName(const_cast<char*>(n));
			Py_Initialize();
			if(Py_IsInitialized())
				m_init = true;
			else
				m_init = false;			
			return ok();
}
  bool PyVM::ExecString(const char *s)
{
		assert(ok());
		if( -1 == PyRun_SimpleString(const_cast<char*> (s) ))
			return false;
		return true;
}
  //crash with pyrun_simplefile()! :_(
//http://www.webdocs.org/docs/python/official/faq/008.html#8.7
bool PyVM::ExecFile(char *n)
{
			assert(ok());		
			FILE *f = fopen(n,"r");
			if(!f) return false;
			fseek(f,0,SEEK_END);
			int len =  ftell(f);
			char *p= new char[len+1];
			if(!p){
				fclose(f);
				return false;
			}
			rewind(f);
			fread(p,len,1,f);
			p[len]=0;	
			
			int ret =  ExecString(p);
			fclose(f);
				
			delete [] p;
			if(-1 == ret)			
					return false;
			
			return true;
}
bool PyVM::RegiterMod(PyModule &mod)
{
			assert(ok());		
			std::list<PyModule*>::iterator i = ModList.begin();
			for(;i!=ModList.end();++i){
				if( (*i)->Name() == mod.Name()){
					return false; 
				}
			}
			ModList.push_back(&mod);
			Py_InitModule(const_cast<char*>(mod.Name().c_str()),mod.Methods());
			return true;
  }
  
		
 
 
  	
 
 
     |  
  
 | 
 
  
Currently browsing [py.zip] (32,340 bytes) - [py.h] - (1,156 bytes)
 
 #ifndef _PY_H_
#define _PY_H_
  
#define BEGIN_REG() 	methods.clear() 
#define REGISTER(x,y) 	RegisterMethod(x,y) 
#define END_REG() \
		do	{ \
			PyMethodDef __tmp = {NULL, NULL, 0, NULL};\
			methods.push_back(__tmp);\
		}while(0)	
  
class PyModule 
{
	public:
  		typedef PyObject *(*PyCallback )(PyObject *, PyObject *);
		
		PyModule							(const char *n): m_Name(n) {	  }
		virtual			    ~PyModule		();
		PyMethodDef*		 Methods		() {	return &(methods[0]);	}
		const std::string&   Name			() const    {	return m_Name; 			}
		void			     RegisterMethod	(const char *, PyCallback );
		
	protected:
  		std::vector <PyMethodDef> methods;
		std::string				  m_Name;
	
		
};
  class PyVM
{
	public:
		
						PyVM		(): m_init(false) {	}
		virtual		   ~PyVM		() { 	End();		}
		void			End			() {	if(ok()){ Py_Finalize(); m_init = false;}	}
		inline bool		ok			() const { return m_init;	}
  		bool			Init		(const char *);	
		bool			ExecString	(const char *);
		bool			ExecFile	(char *);
		bool			RegiterMod	(PyModule &);
		
  	private:
  		bool				 m_init;
		std::list<PyModule*> ModList;
  };
  #endif // ~ _PY_H_   |  
  
 | 
 
  
Currently browsing [py.zip] (32,340 bytes) - [PyMod.h] - (490 bytes)
 
 #ifndef _PYMOD_H_
#define _PYMOD_H_
  
//example mod
class print : public PyModule 
{
	public:
	print(const char *n):PyModule(n) 
	{	
		BEGIN_REG();
			REGISTER("mega_print",print::printer);
		END_REG();
	
	
	}
	//method's
	static PyObject *printer(PyObject *self, PyObject *args)
	{
		char *cmd;
		int sts;
		if (!PyArg_ParseTuple(args, "s", &cmd))
			return NULL;
		sts = puts(cmd);
		return Py_BuildValue("i", sts);
	}
	private:
		
		
};
#endif // ~_PYMOD_H_   |  
  
 | 
 
  
Currently browsing [py.zip] (32,340 bytes) - [StdAfx.cpp] - (289 bytes)
 
 // stdafx.cpp : source file that includes just the standard includes
//	py.pch will be the pre-compiled header
//	stdafx.obj will contain the pre-compiled type information
#include "stdafx.h"
  // TODO: reference any additional headers you need in STDAFX.H
// and not in this file
   |  
  
 | 
 
  
Currently browsing [py.zip] (32,340 bytes) - [StdAfx.h] - (832 bytes)
 
 // stdafx.h : include file for standard system include files,
//  or project specific include files that are used frequently, but
//      are changed infrequently
//
#if !defined(AFX_STDAFX_H__A8196DB2_BF67_4B88_BA0D_BAF1905FD4BA__INCLUDED_)
#define AFX_STDAFX_H__A8196DB2_BF67_4B88_BA0D_BAF1905FD4BA__INCLUDED_
  #if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
  #include <python/python.h>
#include <stdio.h>
#include <assert.h>
#include <string>
#include <vector>
#include <list>
#include "py.h"
#include "PyMod.h"
  
// TODO: reference additional headers your program requires here
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_STDAFX_H__A8196DB2_BF67_4B88_BA0D_BAF1905FD4BA__INCLUDED_)
   |  
  
 | 
 
  
Currently browsing [py.zip] (32,340 bytes) - [main.cpp] - (578 bytes)
 
 //
// main.cpp
// ethernet - qualopec@lycos.es
//
// to compile and execute you need python22.lib, python22.dll and python headers
// www.python.org - http://www.python.org/ftp/python/2.2.2/Python-2.2.2.exe
//
#include "stdafx.h"
  int main(int argc, char* argv[])
{
     PyVM vm;  
   print  mod("foo");
   vm.Init(argv[0]);    
   vm.RegiterMod(mod);   
   std::string cmd =  "								    \n"
					  "import foo;					    \n"
					  "foo.mega_print(\"py@exe -> HI HII!! \");      ";
  	vm.ExecString(cmd.c_str());
	vm.ExecFile("file.py");
	return 0;
  
}   |  
  
 | 
 
 
 
The zip file viewer built into the Developer Toolbox made use
of the zlib library, as well as the zlibdll source additions.
 
 
 |