[Q] ImportError by __import__() on Python >= 3.4

Makoto Kuwata kwa at kuwata-lab.com
Sat Jun 4 09:16:29 EDT 2016


On Sat, Jun 4, 2016 at 3:15 AM, MRAB <python at mrabarnett.plus.com> wrote:

> On 2016-06-03 06:48, Makoto Kuwata wrote:
>
> On Fri, Jun 3, 2016 at 9:31 AM, MRAB <python at mrabarnett.plus.com <mailto:
>> python at mrabarnett.plus.com>> wrote:
>>
>>     On 2016-06-02 15:04, Makoto Kuwata wrote:
>>
>>         Hi,
>>
>>         I have a trouble around __import__().
>>         The following sample code works well on Python <= 3.3,
>>         but it raises ImportError on Python >= 3.4.
>>
>>
>>             ## importtest.py
>>             import sys, os, shutil
>>
>>             def test(name):
>>                 try:
>>                     ## create 'foo/__init__.py' file
>>                     os.mkdir(name)
>>                     with open(name + "/__init__.py", 'w') as f:
>>                         f.write("X=1")
>>                         f.flush()
>>                     ## ipmort 'foo' module
>>                     mod = __import__(name)
>>                 finally:
>>                     if os.path.isdir(name):
>>                         shutil.rmtree(name)
>>
>>             test("foo")    # no errors
>>             test("bar")    # may raise error on Python >= 3.4. Why?
>>
>>
>>         Output Example:
>>
>>             ### No errors  (Python <= 3.3)
>>             ubuntu$ export PYTHONPATH=.
>>             ubuntu$ for x in 1 2 3 ; do /usr/bin/python3.3
>>         importtest.py; done
>>
>>             ### ImportError (Python >= 3.4)
>>             ubuntu$ export PYTHONPATH=.
>>             ubuntu$ for x in 1 2 3 ; do /usr/bin/python3.4
>>         importtest.py; done
>>             Traceback (most recent call last):
>>               File "tmp/importtest.py", line 19, in <module>
>>                 test("bar")    # may raise error on Python >= 3.4. Why?
>>               File "tmp/importtest.py", line 13, in test
>>                 mod = __import__(name)
>>             ImportError: No module named 'bar'
>>
>>
>>         Please give me any advices or hints.
>>         Thanks.
>>
>>     Things to try:
>>
>>     Does the order matter? If you try "bar" then "foo" does "foo" fail?
>>
>>
>> Yes. Name is not matter. Order is matter.
>>
>>
>>     Does the directory matter?
>>
>>
>> No. I created "foo" and "bar" directories in order to create python
>> module.
>>
>>
>>     Is there something called "bar" in the directory already?
>>
>>
>> No. Sample script removes directories every time.
>>
>>
>>     What does the created "bar" directory contain? Does it really
>>     contain only "__init__.py"?
>>
>>
>> Yes. See sample script for detail.
>>
>>     You're testing the script 3 times; on which iteration does it fail?
>>
>>
>> Because sometimes script will fail and sometimes will work file.
>>
>> It sounds like it's some kind of race condition, e.g. it hasn't finished
> writing the file before it does the import.
>

Maybe.
I want to know why it happens on Python >= 3.4 and not on Python <= 3.3.

It happens on both Linux (ubuntu 14.04) and MacOSX (El Captain).

--
regards,
makoto


More information about the Python-list mailing list