将模块放入 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.
我知道这个问题有点深奥 - 但希望它能帮助其他试图了解导入系统的掉队者。
过去,为了在 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.
我知道这个问题有点深奥 - 但希望它能帮助其他试图了解导入系统的掉队者。