Crash on (un-orthodox) __import__

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)
Produces a hard crash on Python (i.e., a dialog box with a "python.exe has stopped working" message). I know I am not supposed to import stuff like that, but I was curious to understand why Python should crash in this way. This happens on Python 2.7.2 with Numpy 1.6.1 and Python 2.5.4 with Numpy 1.5.0
Thank you for your suggestions :-D
Andrea.
"Imagination Is The Only Weapon In The War Against Reality." http://xoomer.alice.it/infinity77/
import PyQt4.QtGui
Traceback (most recent call last): File "<interactive input>", line 1, in <module> ImportError: No module named PyQt4.QtGui
import pygtk
Traceback (most recent call last): File "<interactive input>", line 1, in <module> ImportError: No module named pygtk
import wx

Hi Andrea,
On Tue, Oct 4, 2011 at 3:04 AM, Andrea Gavana andrea.gavana@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'
best,

On Thu, Oct 6, 2011 at 17:25, Paul Ivanov pivanov314@gmail.com wrote:
Hi Andrea,
On Tue, Oct 4, 2011 at 3:04 AM, Andrea Gavana andrea.gavana@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.

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.
You could try faulthandler, it prints the (python) traceback after a crash: http://pypi.python.org/pypi/faulthandler/

On 10/6/2011 9:33 PM, Robert Kern wrote:
On Thu, Oct 6, 2011 at 17:25, Paul Ivanovpivanov314@gmail.com wrote:
Hi Andrea,
On Tue, Oct 4, 2011 at 3:04 AM, Andrea Gavanaandrea.gavana@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
participants (5)
-
Andrea Gavana
-
Christoph Gohlke
-
Han Genuit
-
Paul Ivanov
-
Robert Kern