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, -- Paul Ivanov 314 address only used for lists, off-list direct email at: http://pirsquared.org | GPG/PGP key id: 0x0F3E28F7
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. -- Robert Kern "I have come to believe that the whole world is an enigma, a harmless enigma that is made terrible by our own mad attempt to interpret it as though it had an underlying truth." -- Umberto Eco
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 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.
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