将模块导入Python搜索路径

时间:2017-09-21 15:13:54

标签: python python-import python-module

过去,为了让我在python中使用/导入我自己的自定义包,我所要做的就是编辑我的.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'

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

提前致谢。

2 个答案:

答案 0 :(得分:0)

你的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/"

然后尝试导入您的模块。

答案 1 :(得分:0)

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

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

  

Python文件布局

     

Python安装在模块目录中有一个site-packages目录。此目录是删除用户安装的软件包的位置。维护此目录中的.pth文件,其中包含安装额外软件包的目录的路径。

我知道这个问题有些深奥 - 但希望它可以帮助其他试图理解导入系统的散兵游勇。