【问题标题】:Setting a default sys.path for a Notebook为 Notebook 设置默认的 sys.path
【发布时间】:2016-07-07 03:51:18
【问题描述】:

我的所有 .py 文件都在一个文件夹脚本中,我所有的 IPython 笔记本都在一个名为 Notebook 的文件夹中。

每个笔记本文件对脚本上的一个或多个文件有多个交叉依赖项。

在每个笔记本上都有sys.path.append 似乎很麻烦,我希望有一种方法可以添加默认查找路径,就像我们将PYTHONPATH 添加到.bash_profile 一样。

现在我执行以下操作:

import sys
sys.path.append("<path where DeriveFinalResultSet.py exists>)
import DeriveFinalResultSet as drs

我希望有一个可以执行以下操作的设置:

import DeriveFinalResultSet as drs

【问题讨论】:

  • 我不知道这里的答案,但也许您可以将其添加到自定义文件中:ipython.org/ipython-doc/2/config/…
  • 或者,您可以在给定脚本上调用 ipython 之前创建一个带有设置 PYTHONPATH 的简单 bash 脚本...
  • @mgilson:我更新了 .bash_profile 并将 PYTHONPATH 指向我想要的目录。我从控制台启动了jupiter-notebook,它似乎在起作用。我只是在下面发布答案。如果可以,你能验证它是否正确吗?

标签: python jupyter-notebook sys.path


【解决方案1】:

为了避免“隐藏配置”(即不在源代码控制/机器特定的东西)并像您描述的那样保持笔记本/代码分离,我做了如下的事情:

code/
    mymodule.py
    mypackage/
        __init__.py

notebooks/
    mynb.ipynb
    mynb2.ipynb
    paths.py   <--- below

paths.py:

import sys
import pathlib
sys.path.insert(0, str(pathlib.Path(__file__).parents[1] / 'code'))
# sys.path[0] = str(pathlib.Path(__file__).parents[1] / 'code')

那么在mynb*.ipynb我就可以愉快地做:

import paths
import mymodule, mypackage

后一种形式有效地替换了从空字符串(当前目录)到“代码”目录的导入路径,这可能更简洁一些。这使得导入对使用 os.chdir() 之类的东西不敏感。

【讨论】:

  • 很好的答案。也许pathlib.Path().resolve().parent 是一个小的改进?
【解决方案2】:

我编写了简单的 bash 脚本来更新路径并启动 Jupyter:

#!/usr/bin/env bash

echo "Saving PYTHONPATH"
ORIGINAL_PYTHONPATH=$PYTHONPATH
echo "Prepending package to PYTHONPATH"
export PYTHONPATH="$PWD/:$ORIGINAL_PYTHONPATH"
echo "Starting Jupyter"
jupyter notebook
echo "Reverting to the original PYTHONPATH"
export PYTHONPATH=$ORIGINAL_PYTHONPATH

【讨论】:

    【解决方案3】:

    经过一些研究,我意识到将 PYTHONPATH 更改为 .bash_profile 应该可以解决问题。

    这是我添加到 .bash_profile 的两行代码

    PYTHONPATH="<path where DeriveFinalResultSet.py exists>:$PYTHONPATH"
    export PYTHONPATH
    

    为了验证,我在打开一个新的 IPython Notebook 后做了以下操作。

    import sys
    print(sys.path)
    ['', '**<path where DeriveFinalResultSet.py exists>**', '<some path>Google Drive/Project/AnimalPhotoBias/Notebooks', '<some path>anaconda/lib/python35.zip', '<some path>anaconda/lib/python3.5', '<some path>anaconda/lib/python3.5/plat-darwin', '<some path>anaconda/lib/python3.5/lib-dynload', '<some path>anaconda/lib/python3.5/site-packages/Sphinx-1.3.5-py3.5.egg', '<some path>anaconda/lib/python3.5/site-packages/setuptools-20.3-py3.5.egg', '<some path>anaconda/lib/python3.5/site-packages', '<some path>anaconda/lib/python3.5/site-packages/aeosa', '<some path>anaconda/lib/python3.5/site-packages/IPython/extensions', '<some path>.ipython']
    

    【讨论】:

    • 这应该可以。您可以将其简化为 1 行:export PYTHONPATH="...:${PYTHONPATH}"
    • 可能,bash_profile — 不是此类配置的最佳位置。如果您有两个或更多项目,此方法将向PYTHONPATH 添加太多额外路径,并可能导致名称冲突。
    • 你说得对,@maxkoryukov。在处理多个项目时,这不是一个好方法。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2016-04-25
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    • 1970-01-01
    • 2018-02-12
    • 1970-01-01
    相关资源
    最近更新 更多