So far, I've been advised to: 1/ Double-check that the GIL was correctly acquired 2/ Ensure there's no 'string' module in my project 3/ Manually pre-import commonly used standard modules at interpreter's init-time to avoid race conditions due to the multi-threaded nature of the running environment
No problem found for 1/ & 2/ (double-checked). I tried 3/ before posting and could not reproduce the problem at all which is probably the patch I will apply due to the lack of a better solution. I guess I'll have to dig into __import__'s code and related. On Thursday, February 4, 2016 at 11:20:05 AM UTC+1, Jean-Charles Lefebvre wrote: > Hi all, > > The short version: How CPython marks a module as being fully imported, if it > does, so that the same import statement ran from another C thread at the same > time does not collide? Or, reversely, does not think the module is not > already fully imported? > > The full version: I'm running CPython 3.5.1, embedded into a C++ application > on Windows. The application is heavily multi-threaded so several C threads > call some Python code at the same time (different Python modules), sharing > interpreter's resources by acquiring/releasing the GIL frequently DURING the > calls, at language boundaries. > > Sometimes (but always only once per application instance), a call to > os.path.expandvars raises the AttributeError exception with message: module > 'string' has no attribute 'ascii_letters'. It is raised by the > ntpath.expandvars function (line 372). When I noticed the late import > statement of the 'string' module at the line above, I thought that MAYBE, it > could be because the interpreter is ran in an heavily multi-threaded > environment and that the GIL acquiring/releasing occurred at a bad timing? > Making me wonder how the import mechanism interacts with the GIL, if it does? -- https://mail.python.org/mailman/listinfo/python-list