我们在写python代码或者阅读别人的代码时,可能会碰到对应module无法找到的问题,这时如何解决呢?我们如果对python解释器如何查找对应的module有比较深刻的理解,那么我们就可以轻松解决相关问题。
https://leemendelowitz.github.io/blog/how-does-python-find-packages.html
sys.path
import sys print(' '.join(sys.path)) # 当前目录 D:devenvCodeintro_dsknowhow D:devenvCodeintro_ds # anaconda D:ContinuumAnaconda3python35.zip D:ContinuumAnaconda3DLLs D:ContinuumAnaconda3lib D:ContinuumAnaconda3 D:ContinuumAnaconda3libsite-packages D:ContinuumAnaconda3libsite-packagesSphinx-1.4.6-py3.5.egg D:ContinuumAnaconda3libsite-packageswin32 D:ContinuumAnaconda3libsite-packageswin32lib D:ContinuumAnaconda3libsite-packagesPythonwin D:ContinuumAnaconda3libsite-packagessetuptools-27.2.0-py3.5.egg
上面看到sys.path目录包含了当前脚本所在的目录以及对应安装site环境,那么问题来了:
sys.path是如何被赋值的
从python的文档中https://docs.python.org/2/library/sys.html#sys.path看到:sys.path使用当前的工作目录,以及罗列在PYTHONPATH环境变量中的目录,再加上installation-dependent default paths(这是由site模块来控制的)
如果你的PYTHONPATH环境变量并没有设置,则sys.path将包含:当前工作目录+site模块执行的目录变更。当你启动python时,site模块自动被imported加载。
https://docs.python.org/2/library/site.html#module-site
操作sys.path
import sys, os # This won't work - there is no hi module import hi Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: No module named hi # Create a hi module in your home directory. home_dir = os.path.expanduser("~") my_module_file = os.path.join(home_dir, "hi.py") with open(my_module_file, 'w') as f: f.write('print "hi" ') f.write('a=10 ') # Add the home directory to sys.path sys.path.append(home_dir) # Now this works, and prints hi! import hi print hi.a
module的__file__属性
当你import一个module时,你可以通过查看__file__属性来找到该module具体存在于哪个目录中:
> import numpy > numpy.__file__ '/usr/local/lib/python2.7/dist-packages/numpy/__init__.pyc'
注意,以上对于静态编译到解释器的内置module不适用,比如sys模块就没有__file__属性