[Python-Dev] PyThreadState_GET() returns NULL from within PyImport_GetModuleDict()
Steve Dower
steve.dower at python.org
Tue Aug 8 11:39:12 EDT 2017
On 07Aug2017 2231, Patrick Rutkowski wrote:
> So, it seems to be the case that picking a mismatched python binary
> causes the crash, __but only with python3, not with python36__. This
> makes me wonder what the differences is between the two in the first
> place. I was getting the crash to begin with because I was linking my
> Debug build with the release build python3.lib, since I thought it
> shouldn't matter.
>
> My problem is fixed now, but if anyone could sheld light on the
> details of why exactly it happened then I would certainy be
> interested.
I'd love to be able to, but honestly I have basically no idea.
There is only one implementation of PyThreadState_Get() (which is what
the PyThreadState_GET macro should map to), and that should never return
NULL without terminating the entire process.
My best guess is that the API forwarding being done by python3.dll is
failing somehow and is turning into a function that returns 0.
Since you are embedding rather than building an extension module, I'd
suggest linking directly to python36[_d].dll, since you will presumably
be including the Python runtime with your application (this is exactly
the use case for the embeddable package, in case you hadn't seen that).
The python3[_d].dll is most useful when building a .pyd that may be used
with multiple versions of Python 3. It has some limitations and many
bugs though, which I don't know we can ever fully resolve, but all of
which can be avoided in your case by not using it :)
Hope that helps,
Steve
More information about the Python-Dev
mailing list