【问题标题】:How to change the PYTHONPATH of an ipython kernel?如何更改 ipython 内核的 PYTHONPATH?
【发布时间】:2024-01-24 05:07:02
【问题描述】:

我正在进行分析,我打算将我的脚本重组为一个包。我有一个这样的目录结构:

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 notebook 并使用 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 是可导入的。

由于某种原因,这两种环境的路径混淆了。知道如何解决这个问题吗?是否可以手动更改内核的路径?

【问题讨论】:

    标签: python anaconda jupyter-notebook ipython data-science


    【解决方案1】:

    在这里,我希望 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、显示名称和其他内容。

    之后我可以在内核之间切换。

    【讨论】:

    • 编辑后的 ​​kernel.json 如下所示:json { "argv": [...], "display_name": "...", "language": "...", "env": { "PYTHONPATH": "/path/to/your/local/package" } }
    • conda 会自动生成文件。如果存在正确环境的名称和路径,请停用该环境。使用 Jupyter Lab|Notebook 激活环境,您应该可以切换 Python 内核。我不确定它是如何在 iPython 中完成的
    • 是的,conda 将生成此文件,但没有“env”条目(至少在我的情况下,我猜是因为我的默认 PYTHONPATH 是无)。我在谷歌上搜索了一下,才弄清楚如何将“PYTHONPATH”条目添加到这个 json 文件中,所以我认为值得在这里分享。