[Numpy-discussion] Crash on (un-orthodox) __import__

Christoph Gohlke cgohlke at uci.edu
Fri Oct 7 05:10:57 EDT 2011



On 10/6/2011 9:33 PM, Robert Kern wrote:
> On Thu, Oct 6, 2011 at 17:25, Paul Ivanov<pivanov314 at gmail.com>  wrote:
>> Hi Andrea,
>>
>> On Tue, Oct 4, 2011 at 3:04 AM, Andrea Gavana<andrea.gavana at gmail.com>  wrote:
>>> Hi All,
>>>      I was fiddling here and there with some code doing dynamic import of
>>> stuff, and I noticed that this code:
>>> import os
>>> import sys
>>> init_name = r"C:\Python27\Lib\site-packages\numpy\__init__.py"
>>> directory, module_name = os.path.split(init_name)
>>> main = os.path.splitext(module_name)[0]
>>> sys.path.insert(0, os.path.normpath(directory))
>>> # Crash here...
>>> mainmod = __import__(main)
>>
>>
>> in this case, your main is '__init__' and your directory is
>> 'C:\Python27\Lib\site-packages\numpy' which is probably not what you
>> intended. You should make directory 'C:\Python27\Lib\site-packages'
>> and main into 'numpy'
>
> Still, it shouldn't segfault, and it's worth figuring out why it does.
> gdb has been mostly unenlightening for me since gdb won't let me
> navigate the traceback.
>


This is the same crash that occurs when running `python -v -c"import 
__init__"` from within the site-packages/numpy directory. Several numpy 
Python and C extension modules are imported/executed twice. Besides 
fixing the segfault it might be worth preventing this type of import in 
numpy/__init__.py, for example:


import sys as _sys
if '__init__' in _sys.modules and _sys.modules['__init__'].__file__ == 
__file__:
     _sys.stderr.write("Use `import numpy` ... .\n")  # or raise 
ImportError()
else:
    ...
del _sys


The faulthandler output is:

   File "core\numerictypes.py", line 226 in _evalname
   File "core\numerictypes.py", line 247 in bitname
   File "core\numerictypes.py", line 307 in _add_aliases
   File "core\numerictypes.py", line 330 in <module>
   File "core\__init__.py", line 8 in <module>
   File "__init__.py", line 146 in <module>
   File "<stdin>", line 1 in <module>


The function call that crashes during the second import of 
core/numerictypes.py is `int("64")`.

Christoph



More information about the NumPy-Discussion mailing list