过去,为了让我在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'
我不知道发生了什么变化。我错过了什么?
提前致谢。
答案 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文件,其中包含安装额外软件包的目录的路径。
我知道这个问题有些深奥 - 但希望它可以帮助其他试图理解导入系统的散兵游勇。