Created on 2014-06-17 02:48 by abraithwaite, last changed 2014-10-06 14:38 by georg.brandl. This issue is now closed.

Messages (9)

Is this expected? It was very confusing when I cloned a repo that didn't have the __init__.py there when I had just made it, but of course git doesn't track files, only directories. I had accidentaly done mkdir instead of touch. $ mkdir pkg/__init__.py $ touch pkg/foobar.py $ python Python 3.4.1 (default, May 19 2014, 17:23:49) [GCC 4.9.0 20140507 (prerelease)] on linux Type "help", "copyright", "credits" or "license" for more information. >>> from pkg import foobar >>> foobar <module 'pkg.foobar' from '/home/abraithwaite/pkg/foobar.py'> >>>

> but of course git doesn't track files, only directories. but of course git doesn't track *directories*, only *files*.

msg220789 - (view) Author: Raymond Hettinger (rhettinger) * Date: 2014-06-17 04:54

> Is this expected? It is a little weird but usually problematic. The cause that import checks for the existence of '__init__.py' but doesn't then add isfile() or isdir() check which would be unnecessary 99.9% of the time. I classify this a harmless oddity.

msg220802 - (view) Author: Berker Peksag (berker.peksag) * Date: 2014-06-17 07:10

I think this is related to PEP 420. $ tree pkg/ pkg/ ├── foobar.py $ python3.2 -c "from pkg import foobar" Traceback (most recent call last): File "<string>", line 1, in <module> ImportError: No module named pkg But, with Python 3.3 and newer: $ python3.3 -c "from pkg import foobar" hello See https://docs.python.org/3/whatsnew/3.3.html#pep-420-implicit-namespace-packages for the whatsnew entry.

Interesting. I saw the same behavior on 2.7.7 as well: $ python2 Python 2.7.7 (default, Jun 3 2014, 01:46:20) [GCC 4.9.0 20140521 (prerelease)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> from pkg import foobar >>> foobar <module 'pkg.foobar' from 'pkg/foobar.py'> >>> Anyways, it doesn't bother me too much. I opened a ticket because I couldn't find an already open bug about it or any reference to it on google (although the keywords aren't great for google searches). Cheers!

msg220841 - (view) Author: STINNER Victor (vstinner) * Date: 2014-06-17 15:54

See also the issue #7732.

msg220842 - (view) Author: STINNER Victor (vstinner) * Date: 2014-06-17 16:00

I remember that I added an check in Python 3.2 on the file type to explicitly reject directories: http://hg.python.org/cpython/rev/125887a41a6f + if (stat(buf, &statbuf) == 0 && S_ISDIR(statbuf.st_mode)) + /* it's a directory */ + fp = NULL; + else I wrote this change in the C code, I didn't report the change to the Python code (importlib). A huge work was also done in importlib to reduce the number of calls to stat(). So maybe a check was dropped by mistake?

msg221131 - (view) Author: Raymond Hettinger (rhettinger) * Date: 2014-06-20 22:56

> So maybe a check was dropped by mistake? Why do we care? For the most part, Linux treats directories as files (if I do a mkdir twice, the error is "mkdir: tmp: File exists". We don't care about the other flags rwx so why should we care about d? Python should avoid adding superfluous checks when it doesn't have to. > Anyways, it doesn't bother me too much. AFAICT, it hasn't bothered anyone.

msg228698 - (view) Author: Georg Brandl (georg.brandl) * Date: 2014-10-06 14:38