New submission from Madison May:
Naming a file `io.py` in the root directory of a project causes the following error on 2.7:
AttributeError: 'module' object has no attribute 'BufferedIOBase'
Similar issues arise on 3.x., although the error message is a bit more useful:
Fatal Python error: Py_Initialize: can't initialize sys standard streams AttributeError: 'module' object has no attribute 'OpenWrapper'
At the very least we should ensure that the error message is a bit more straightforward and clear, as I imagine its not all that uncommon to cause this kind of conflict.
---------- assignee: docs@python components: Documentation, IO messages: 215940 nosy: docs@python, madison.may priority: normal severity: normal status: open title: Naming a file` io.py` causes cryptic error message versions: Python 2.7
Ned Deily added the comment:
Using a local module name that shadows one in the standard library is a very common "import trap". See, for example, https://ncoghlan_devs-python-notes.readthedocs.org/en/latest/python_concepts.... I did a quick search through the documentation and didn't find an explicit reference to the general topic. If it isn't already, it probably should be mentioned in the tutorial and the FAQ. I don't think that 'io' should be special-cased.
---------- components: -IO nosy: +ned.deily
Brett Cannon added the comment:
While mentioning something in the FAQ and/or tutorial is fine, I wouldn't want to change Python's message too much to deal with this unless it was extremely fast (e.g. we pre-generated a set and check that on ImportError and then modified the message only in those instances).
---------- nosy: +brett.cannon
Madison May added the comment:
I definitely agree that io shouldn't be special cased, as it's more about the name shadowing issue that this specific example.
A simple docs addition would make me happy, to be honest.
Martin v. Löwis added the comment:
I think the AttributeError message should improve, and special-case certain common types, in particular modules. E.g. it could read
AttributeError: module 'io' has no attribute 'BufferedIOBase'
AttributeError: <module 'io' from 'C:\Program Files\Python34\lib\io.py'> has no attribute 'BufferedIOBase'
IIUC, the first version would already have helped the OP, and the second version would have been dead-clear (except that it is a little verbose).
---------- nosy: +loewis
Christian Theune added the comment:
I managed to create a patch that relies (in hopefully reasonably safe manner) on embedding an object repr for identification in this and similar cases. This is basically what implements what Martin suggested.
Caveat emptor: my C knowledge is only good enough to be dangerous. Thomas Wouters and RDM helped me through it.
I haven't adapted the tests yet (lots of failures due to the output change) but I managed them to stop crashing.
The 'repr.py' in the root is my current testbed to see what's going on.
---------- nosy: +ctheune, r.david.murray, twouters
Changes by Christian Theune email@example.com:
---------- keywords: +patch Added file: http://bugs.python.org/file34937/4ae151db1bd9.diff
STINNER Victor firstname.lastname@example.org added the comment:
No activity for 5 years, I close the issue.
---------- nosy: +vstinner resolution: -> out of date stage: test needed -> resolved status: open -> closed