Recently I was experiencing following liknking error [1] .
I was checking path VC++ directories settings, upgrading from boost 1.55 to 1.57, still the same issue. After couple of ours, the resolution was so simple, I could not believe I can be so absent minded.
Never try to compile project referencing 32bit of boost, and linking 64bit Python engine.
[1] error LNK2001: unresolved external symbol __imp__PyObject_IsTrue %PATH%\libboost_python-vc120-mt-gd-1_55.lib(class.obj)
Saturday, December 6, 2014
Thursday, November 20, 2014
Boost::Python callback triggered from Non-Python created threads
Consider we have virtual/abstract C++ class that's fully implemented in Python. And for some sake of necessity we have a callback method (e.g. as some sort of event) that is being triggered from different thread on C++ side and is handled in Python .
In such case corresponding callback methods have to manage global interpreter lock state with PyGILState_STATE member variable.
So the resulting C++ callback class definition will look like below (notice that Python method calls are wrapped up with GIL state handling code).
In such case corresponding callback methods have to manage global interpreter lock state with PyGILState_STATE member variable.
So the resulting C++ callback class definition will look like below (notice that Python method calls are wrapped up with GIL state handling code).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | class SessionStatusListenerCallback : public SessionStatusListener { public: SessionStatusListenerCallback(PyObject *pyObject) : self(pyObject) {} SessionStatusListenerCallback(PyObject* pyObject, const SessionStatusListener& listener) : self(pyObject), SessionStatusListener(listener) {} void onSessionStatusChanged(O2GSessionStatus status) { // GIL state handler PyGILState_STATE gstate; gstate = PyGILState_Ensure(); // Python callback call_method<void>(self, "onSessionStatusChanged", status); // GIL handler release PyGILState_Release(gstate); } void onLoginFailed(const char* error) { // GIL state handler PyGILState_STATE gstate; gstate = PyGILState_Ensure(); // Python callback call_method<void>(self, "onLoginFailed", error); // GIL handler release PyGILState_Release(gstate); } private: PyObject* const self; }; |
Wednesday, November 12, 2014
Microsoft Visual C++ Compiler for Python 2.7
New tool Microsoft Visual C++ Compiler for Python 2.7 is available.
I have not tested it yet. But solution for:
The typical error message you will receive if you need this compiler package is Unable to find vcvarsall.bat.
sounds promising :)
I have not tested it yet. But solution for:
The typical error message you will receive if you need this compiler package is Unable to find vcvarsall.bat.
sounds promising :)
Friday, November 7, 2014
Handling "AddressAccessDeniedException: HTTP could not register URL" error
Having self hosting WCF service one can get following exception:
AddressAccessDeniedException: HTTP could not register URL http://+:13025/
By default, listening at a particular HTTP address requires administrator privileges. Since application users does not often have such privileges it's necessary to allow port listening for particular user or group via nesth.
E.g.
netsh http add urlacl url=http://+:13025/applicationsvcs/booking user=DOMAIN\app_account
AddressAccessDeniedException: HTTP could not register URL http://+:13025/
By default, listening at a particular HTTP address requires administrator privileges. Since application users does not often have such privileges it's necessary to allow port listening for particular user or group via nesth.
E.g.
netsh http add urlacl url=http://+:13025/applicationsvcs/booking user=DOMAIN\app_account
Proxying WCF service through the Fiddler
Set Fiddler as system wide proxy with preferred port (e.g. 8888).
Change app config of the WCF service host application as follows
<system.net>
<defaultProxy
enabled = "true"
useDefaultCredentials = "true">
<proxy autoDetect="false" bypassonlocal="false" proxyaddress="http://127.0.0.1:8888" usesystemdefault="false" />
</defaultProxy>
</system.net>
That's it.
Change app config of the WCF service host application as follows
<system.net>
<defaultProxy
enabled = "true"
useDefaultCredentials = "true">
<proxy autoDetect="false" bypassonlocal="false" proxyaddress="http://127.0.0.1:8888" usesystemdefault="false" />
</defaultProxy>
</system.net>
That's it.
Wednesday, August 27, 2014
How to handle pure virtuals with optional argumets in Boost::Python
Let's assume we have following C++ snippet:
This would solve the optionality of the parameter, hovewer how to pass any default value? So I've ended up using args:
class A { public: virtual void Method1(const char* par1, IInterface* p = 0) = 0; };
How to handle default value for paremeter p?
My first idea was using BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS as per boost doc.
class AWrap: public A, public wrapper<A> { public: void Method1(const char* par1, IInterface* p = 0){ this->get_override("Method1")();} }; BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(method_overload, IInterface::onRequestCompleted, 1, 2) class_<AWrap>("A") .def("Method1", &A::Method1, method_overload()) ;
This would solve the optionality of the parameter, hovewer how to pass any default value? So I've ended up using args:
class_<AWrap>("A") .def("Method1", &A::Method1, (arg("par1"), arg("p") = 0)) ;
Friday, July 25, 2014
Python 2.7.8 is out
Unexpected is true Python 2.7.8 is out.
Saturday, July 19, 2014
HelloWorld with Boost, Visual Studio 2013 and Python Tools for Visual Studio
So I've Boost compiled and prepared for some serious things and big projects :).
But first I was eager to test of wrapping some simple C++ code with Boost library and calling the resulting library from Python and all of that within one instance of Visual Studio 2013.
This is a result of my effort on experimental HelloWorld library incorporating:
The main things for library to be callable from Python that are really important and are not aforementioned in Boost documentation:
The sample code is available on github:
Once I have had library compiled I was test it within Visual Studio's Python interpreter. (I really like the simplicity of combining C++ and Python in one development tool). That's really cool.
But first I was eager to test of wrapping some simple C++ code with Boost library and calling the resulting library from Python and all of that within one instance of Visual Studio 2013.
This is a result of my effort on experimental HelloWorld library incorporating:
- Python (libs and includes being referenced from Visual Studio)
- Visual Studio 2013
- Python Tools for Visual Studio
- Boost 1.5.5(compiled and lib and includes directories being referenced from Visual Studio)
The main things for library to be callable from Python that are really important and are not aforementioned in Boost documentation:
- Resulting DLL has to be renamed to PYD. Python interpreted does not load DLL (At least I was not successful in convincing an interpreter to do that)
- Resulting PYD library has to have the same name like parameter of BOOST_PYTHON_ MODULE(...). So in my case I have hello as a parameter so correspondingly my compiled module is named hello.pyd.
- PYD file has to be available/findable for Python interpreter. Verify that your file is in corresponding %PYTHONPATH%. Otherwise Python's import hello (in my case) would cause runtime errors.
#define BOOST_ALL_DYN_LINK #define BOOST_LIB_DIAGNOSTIC #define BOOST_PYTHON_STATIC_LIB #include <boost/python.hpp> using namespace boost::python; class World { public: void set(std::string msg) { this->msg = msg; } std::string greet() { return msg; } std::string msg; friend std::ostream &operator<<(std::ostream &o, World const &w) { o << w.msg ; return o; } }; BOOST_PYTHON_MODULE(hello) { class_<World>("World") .def("greet", &World::greet) .def("set", &World::set) .def(self_ns::str(self_ns::self)) ; }
The sample code is available on github:
Once I have had library compiled I was test it within Visual Studio's Python interpreter. (I really like the simplicity of combining C++ and Python in one development tool). That's really cool.
Friday, July 18, 2014
Compiling Boost with Visual Studio 2013 for 64bits
Recently I needed to use Boost library in one of my project. So I've downloaded Boost package from boost.org and needed to build the whole Boost package for my Visual Studio 2013
The required steps I've had to do to build the Boost package were following.
Update 2014-12-05:
Do not expect that building 32bit boost against 64bit version of python will bring any promising result :(.
The required steps I've had to do to build the Boost package were following.
- Open command prompt in root of %boost_install_dir%
- Execute bootstrap.bat
- Execute
b2 toolset=msvc-12.0 --build-type=complete --libdir=%mylibs%\lib\x64 architecture=x86 address-model=64 install -j4
- Add %mylibs%\lib\x64 into the libs path in the Visual Studio
Update 2014-12-05:
Do not expect that building 32bit boost against 64bit version of python will bring any promising result :(.
Tuesday, July 8, 2014
Install python package (pandas) fails on Windows 7 64bit
UPDATE 2014/11/11: New tool Microsoft Visual C++ Compiler for Python 2.7 available. Not tested yet, but seems to solve the problem....
Recently I was experiencing following problem when I've needed to install some python package.
File "{%python%}\lib\distutils\msvc9compiler.py", line 299, in query_vcvarsall
raise ValueError(str(list(result.keys())))
ValueError: [u'path']
I've had installed VS 2008 Express edition already. After some investigation I've realized that VS2008 Express does not have support for x64. So I've had to made following few steps to make python package installer running smoothly:
1. Download corresponding iso image from Windows SDK for Windows 7 and .NET Framework 3.5 SP1 and install it
2. Locate vcvars64.bit in %INSTALL_FOLDER%Microsoft Visual Studio 9.0\VC\bin\
3. Copy vcvars64.bat to .\vcvarsamd64.bat
4. Copy vcvars64.bat to .\amd64\vcvarsamd64.bat
After these steps I was able to install required package successfully.
Subscribe to:
Posts (Atom)