为Noteb设置默认sys.path

2024-06-16 10:33:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我所有的.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

Tags: 文件pathpyimport脚本文件夹asipython
3条回答

经过一些研究,我意识到改变PYTHONPATH中的.bash_profile应该起到作用。

下面是我添加到我的.bash_profile中的两行

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

为了验证,我在打开一个新的IPython笔记本后做了如下操作。

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']

我编写了简单的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

为了避免“隐藏的配置”(即不在源代码管理/机器特定的内容中)和保持像您描述的那样的笔记本/代码分离,我做了如下操作:

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

等等

后一种形式有效地替换了从空字符串(当前目录)到“code”目录的导入路径,这可能更干净一些。这使得导入对使用诸如os.chdir()之类的内容不敏感。

相关问题 更多 >