我正在做分析,我打算将我的脚本重组成一个包。我有一个这样的目录结构:
project
| README.md
| setup.py
| requirements.txt
|
└───data
└───notebooks
| notebook_A.ipynb
|
└───my_package
| __init__.py
|
└───module_A
| __init__.py
| source_A.py
|
└───module_B
__init__.py
source_B.py
首先,我将使用 Conda 创建一个环境:
conda create my_environment
然后,目标是使my_package可在笔记本中导入,而不会失去编辑源的功能。所以我会跑:
$ (my_environment) pip install -e .
这将按预期工作并创建:
/Applications/anaconda3/envs/my_environment/lib/python3.6/site-packages/my_package.egg-link
然后我想检查一切正常:
$ (my_environment) cd notebooks
一切都在 ipython 中工作:
$ (my_environment) ipython
In [1]: import src
In [2]: src.__path__
Out[2]: ['/Users/jalmarituominen/Desktop/my_environment_project/src']
但是当我运行 jupyter 笔记本并使用内核运行它时my_environment我得到
import sys
sys.path
[1]:
['',
'/Applications/anaconda3/lib/python36.zip',
'/Applications/anaconda3/lib/python3.6',
'/Applications/anaconda3/lib/python3.6/lib-dynload',
'/Applications/anaconda3/lib/python3.6/site-packages',
'/Applications/anaconda3/lib/python3.6/site-packages/aeosa',
'/Applications/anaconda3/lib/python3.6/site-packages/IPython/extensions',
'/Users/jalmarituominen/.ipython']
当然,我无法导入my_package因为它不在 PATH 中。
但是,当我将内核更改为 Python 3 时,我得到:
import sys
sys.path
[1]:
['/Applications/anaconda3/envs/my_environment/lib/python36.zip',
'/Applications/anaconda3/envs/my_environment/lib/python3.6',
'/Applications/anaconda3/envs/my_environment/lib/python3.6/lib-dynload',
'',
'/Applications/anaconda3/envs/my_environment/lib/python3.6/site-packages',
'/Users/jalmarituominen/Desktop/my_environment_project',
'/Applications/anaconda3/envs/my_environment/lib/python3.6/site-packages/IPython/extensions',
'/Users/jalmarituominen/.ipython']
而且my_package是可进口的。
由于某种原因,这两个环境的路径被混淆了。知道如何解决这个问题吗?是否可以手动更改内核的路径?
在这里,我希望Jupyter做点什么来简化环境的变化。这是我为获得更正结果所做的:
$ conda activate my_env
$ (my_env) conda install ipykernel -y
$ (my_env) python -m ipykernel install --user --name my_env --display-name "My Env"
然后,我确保我有正确的 Python 路径到我的环境
$ (my_env) jupyter kernelspec list | grep my_env
这给了我环境内核的位置。其中有一个.json设置文件,您可以编辑路径以更正Python,显示名称和其他内容。
在此之后,我可以在内核之间切换。