Pycharm, Jupyter Notebook, 从不同的目录导入我自己的源文件

Pycharm, Jupyter Notebook, import my own source files from different directory

我的目录结构如下

project/
  jupyter/
    note.ipynb
  src/
    some_script.py
    another_script.py

jupyter 子目录包含 Jupyter 笔记本,src 子目录包含我的 .py 文件。 src 子目录被标记为源目录。

在 Jupyter notebook note.ipynb 中,如果我这样做 import some_script,那么我会得到 ImportError: No module named 'some_script'。但是,from src import some_script 工作正常,但如果 some_script 也有行 import another_script 则不行。在我看来,我在想某个地方有一个设置或开关,可以将 src 子目录添加到 Jupyter Notebook 环境默认使用的 PYTHONPATH 中,但我不知道该怎么做, 你能帮忙吗?

我知道我可以随时使用 sys.path.append,但我不想在我创建的每个 Jupyter 笔记本中都这样做。我也知道我可以将 .ipynb 文件和 .py 文件放在同一个子目录中,但我不喜欢那样组织我的工作。最后,我知道我可以将项目目录设置为我的源代码根目录而不是 src 子目录,但这意味着我必须在我的 .py 脚本中的任何地方执行 from src import ... ,显然我不想那样做。我上面描述的这个问题有解决方案吗?

不知道这是否有帮助,但 Jupyter 将自己限制为仅查看打开位置下方的文件,据我所知,这是为了帮助提高 Jupyter Notebooks 服务的设计。默认情况下在多用户环境中。

In my mind I'm thinking that there is a setting or switch somewhere that adds the src subdirectory to the PYTHONPATH used by the Jupyter Notebook environment by default

是的,您可以为每个内核设置 ENV 变量,但您需要找到存储这些变量的位置。

你可以 运行 jupyter kernelspec list,然后在其中打开一个 kernel.json

例如,这个来自我的 PySpark Jupyter 内核。

查看 env: { "PYTHONPATH": 变量。

{
  "argv": [
    "/Users/name/Library/Jupyter/kernels/apache_toree_pyspark_16/bin/run.sh",
    "--profile",
    "{connection_file}"
  ],
  "env": {
    "DEFAULT_INTERPRETER": "PySpark",
    "__TOREE_SPARK_OPTS__": "",
    "__TOREE_OPTS__": "",
    "SPARK_HOME": "/usr/local/opt/apache-spark@1.6/libexec",
    "PYTHONPATH": "/usr/local/opt/apache-spark@1.6/libexec/python:/usr/local/opt/apache-spark16/libexec/python/lib/py4j-0.9-src.zip",
    "PYTHON_EXEC": "python"
  },
  "display_name": "Apache Toree - PySpark (1.6)",
  "language": "python"
}