-
Notifications
You must be signed in to change notification settings - Fork 193
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Windows: exporting a tuple leads to "A dynamic link library (DLL) initialization routine failed." #2190
Comments
Additional information about this bug:
|
It's difficult for me to debug that one as I don't have access to a windows machine. I confirm I can't reproduce on windows. Could you try the following:
I don't see why this would change the behavior (it should actually introduce a leak), just trying. |
Replacing If I comment If I comment Then, I tried to replace this line with Py_ssize_t size = 2;
PyObject* my_tuple = PyTuple_New(size); I again get the same error. Then, I tried to manually write a minimal cpp file exporting one tuple and I again get the same error, but I really don't know if it is correct. #include <Python.h>
Py_ssize_t size = 2;
PyObject* my_tuple = PyTuple_New(size);
static PyMethodDef methods[] = {
{NULL, NULL, 0, NULL} /* Sentinel */
};
static struct PyModuleDef mod_def = {
PyModuleDef_HEAD_INIT,
"my_mod",
"",
-1,
methods,
NULL,
NULL,
NULL,
NULL
};
PyObject *PyInit_my_mod(void)
{
PyObject* theModule = PyModule_Create(&mod_def);
PyModule_AddObject(theModule, "my_tuple", my_tuple);
return theModule;
} I tried to check on Linux but using |
I tried this and it seems the problem is that the tuple is created before If the variable is moved just before static PyObject *my_tuple = to_python(__pythran_test::my_tuple()());
PyModule_AddObject(theModule, "my_tuple", my_tuple);
|
… created That way we have a properly initialized module when we call "to_python" Fix #2190
Tested and works fine. # pythran export a
a = 1
# pythran export b
b = ('2',)
# pythran export c
c = {3: True}
|
yay! thanks for the hint :-)
btw, in which context are you interacting with pythran?
|
By context do you mean where is pythran used? Python 3.13.0 (main, Oct 9 2024, 09:35:48) [Clang 19.1.0 ] 64 bit (AMD64) with MSC v.1939 CRT] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import test3
>>> test3.__file__
'R:\\test3.cp313-win_amd64.pyd'
>>> import os
>>> os.listdir('.')
['$RECYCLE.BIN', 'System Volume Information', 'test3.cp313-win_amd64.pyd', 'test3.py']
>>> test3.a
1 |
No, I meant, what would be the project you're working on that uses pythran, just
being curious.
|
My use case is nothing big really, just speeding up loops for technical indicators. |
Thanks for going all the way down to tracking this bug then ;-)
|
I discovered a funny bug affecting Transonic users on Windows when using Visual Studio and clang-cl (but not MinGW, which explains why I didn't detect that with our CI on Github Actions). Pythran files written by Transonic export a tuple of strings, which usually work fine but not for this specific case.
It is quite simple to reproduce with a Windows machine (details because working on Windows is new for me):
We get:
simple.py
create the extension with
pythran simple.py
import the extension
python -c "import simple"
gives:Note: actually one can also reproduce simply with an environment based on conda-forge created with
mamba create -n env_pythran pythran clang
(in this case clang==18.1.2).Even though I guess exporting a tuple from a pythran file is not common, this bug is quite annoying for me because it affects all Pythran extensions produced through Transonic on Windows for conda-forge 🙂 Therefore, I think I'm going to quickly release a Transonic which does not export this tuple to overcome this bug.
The text was updated successfully, but these errors were encountered: