git.net

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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


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.