msg220787 - (view) |
Author: (abraithwaite) |
Date: 2014-06-17 02:48 |
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'> >>> |
|
|
msg220788 - (view) |
Author: (abraithwaite) |
Date: 2014-06-17 03:30 |
> 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 "", line 1, in 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. |
|
|
msg220832 - (view) |
Author: (abraithwaite) |
Date: 2014-06-17 14:25 |
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 |
I agree, closing. |
|
|