将模块放入 Python 搜索路径

Getting Modules Into Python Search Path

过去,为了在 python 中 use/import 我自己的自定义包,我所要做的就是编辑我的 .bash_profile 以便它们被附加到我的 $PATH 环境变量。

>> echo $PATH
/Users/MYNAME/google-cloud-sdk/bin:/Users/MYNAME/anaconda/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/Users/MYNAME/Documents/Python_Programs/MYPACKAGE1:/Users/MYNAME/Documents/GitRepos/MYPACKAGE2

如您所见,我的路径变量包含 MYPACKAGE1 和 MYPACKAGE2。 前者实际上只是一个文件夹,里面只有一个 .py 文件。后者遵循常规的包文件夹结构。

需要注意的一件事是我的 PYTHONPATH 显然是空的

>> echo $PYTHONPATH

>>

但如果在 python 中,我查看 sys.path:

>> import sys
>> sys.path
['',
 '/Users/MYNAME/anaconda/bin',
 '/Users/MYNAME/anaconda/lib/python36.zip',
 '/Users/MYNAME/anaconda/lib/python3.6',
 '/Users/MYNAME/anaconda/lib/python3.6/lib-dynload',
 '/Users/MYNAME/anaconda/lib/python3.6/site-packages',
 '/Users/MYNAME/Documents/Python_Programs/MYPACKAGE1',
 '/Users/MYNAME/Documents/GitRepos/MYPACKAGE2',
 '/Users/MYNAME/anaconda/lib/python3.6/site-packages/Sphinx-1.5.6-py3.6.egg',
 '/Users/MYNAME/anaconda/lib/python3.6/site-packages/aeosa',
 '/Users/MYNAME/anaconda/lib/python3.6/site-packages/IPython/extensions',
 '/Users/MYNAME/.ipython']

很好,从任一包导入都没有问题。

所以我制作了第三个包,其结构与 MYPACKAGE2

MYPACKAGE3/
    bin/
    README.md
    CHANGES.txt
    setup.py
    MANIFEST.IN
    my_module/
        __init__.py
        sub_module1.py
        sub_module2.py

将其添加到我的路径

>> echo $PATH
/Users/MYNAME/google-cloud-sdk/bin:/Users/MYNAME/anaconda/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/Users/MYNAME/Documents/Python_Programs/MYPACKAGE1:/Users/MYNAME/Documents/GitRepos/MYPACKAGE2:/Users/MYNAME/Documents/GitRepos/MYPACKAGE3

但由于某些原因我无法将其导入 python 并且它不在我的 sys.path 中(sys.path 与以前完全相同)。

>> import my_module
ModuleNotFoundError: No module named 'my_module'

我不知道发生了什么变化。我错过了什么?

提前致谢。

你的 echo $PATH 有

"Users/MYNAME/Documents/GitRepos/MYPACKAGE3" 

而不是

"/Users/MYNAME/Documents/GitRepos/MYPACKAGE3". 

看起来你错过了开头的“/”。

要将自定义路径添加到 sys.path:

import sys
sys.path.append("/Users/MYNAME/Documents/GitRepos/MYPACKAGE3/")

或 BASH:

-bash-4.1$export PYTHONPATH="${PYTHONPATH}:/Users/MYNAME/Documents/GitRepos/MYPACKAGE3/"

然后尝试导入您的模块。

答案是我的$PATH变量与它无关。澄清一下,我使用的是 python 3.6,因此在 2.7 中可能有所不同。

原来在我的 anaconda/.../site-packages 目录中有一个 .pth 文件,我一定是很久以前创建的了。看起来 sys.path 不仅被 .../site-packages 目录填充,而且还被该目录中任何 .pth 文件中列出的所有目录填充(或者它看起来像 sys.path 重新 the hitchikers guide to packaging).

Python file layout

A Python installation has a site-packages directory inside the module directory. This directory is where user installed packages are dropped. A .pth file in this directory is maintained which contains paths to the directories where the extra packages are installed.

我知道这个问题有点深奥 - 但希望它能帮助其他试图了解导入系统的掉队者。