我在这里很困惑。我有一个目录root
,其子目录foo
包含文件__init__.py
。如果我在root
的python REPL中运行以下命令,它可以正常工作:
Python 2.7.5 (default, Aug 25 2013, 00:04:04)
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.chdir('foo')
>>> print __import__('foo')
<module 'foo' from 'foo/__init__.pyc'>
>>>
但是,如果我将相同的命令放入脚本root/import_foo.py
中,则会失败:
import os
os.chdir('foo')
print __import__('foo')
> python import_foo.py
Traceback (most recent call last):
File "import_foo.py", line 3, in <module>
print __import__('foo')
ImportError: No module named foo
为什么会出现差异?我怎么能纠正这个?
答案 0 :(得分:1)
我被问到很久了,但是我在这个问题上花了一个小时,解决方法是在os.chdir之后的sys.path.append(&#34;。&#34;); < / p>
全文: https://mail.python.org/pipermail/python-bugs-list/2004-June/023835.html
在非交互模式的Python 2.3a2中,在os.chdir之后导入 之后,不会在新的当前目录中导入模块 os.chdir。相反,它尝试导入模块(如果存在) os.chdir之前的当前目录中的名称。如果有 那里不是前一个当前目录中那个名称的模块 是一个ImportError异常。
$ mkdir -p some/dir/with/python/
$ cat > some/dir/with/python/example.py
x = 17
$ cat > import_test.py
import os
cwd = os.getcwd()
os.chdir("some/dir/with/python")
m = __import__("example")
print(m)
os.chdir(cwd)
$ python3 import_test.py
Traceback (most recent call last):
File "import_test.py", line 4, in <module>
m = __import__("example")
ImportError: No module named 'example'
BUT:
$ python3
Python 3.4.3 (default, Oct 14 2015, 20:28:29)
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.chdir("some/dir/with/python")
>>> __import__("example")
<module 'example' from '/tmp/some/dir/with/python/example.py'>
>>>
用&#34;。&#34;在sys.path中:
$ cat > import_test.py
import sys
import os
cwd = os.getcwd()
os.chdir("some/dir/with/python")
sys.path.append(".")
m = __import__("example")
print(m)
os.chdir(cwd)
$ python3 import_test.py
<module 'example' from './example.py'>
$