[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