跳转至

Jupyter Notebook中如何设置环境变量?

我们常常通过Jupyter Notebook来分享代码和演示分析结果。有时候,我们需要在代码中使用账号和密码,如果它们也被分享出去,可就大不妙了。正确的做法是把密码设置在环境变量中,在代码中读取环境变量。但是,Jupyter Notebook默认设置下,并不能读取到主机的环境变量。

方法之一是使用jupyterhub_config.py,将环境变量设置在这个文件中:

1
c.Spawner.env_keep = [VAR1, VAR2, ...]

这样,在Jupyter hub启动notebook时,列表中的环境变量就会被带入到notebook中。但是,这仅限于jupyterhub的场景。

另一个方法是使用 python-dotenv库,在每一个notebook的头部,通过cell magic语法加载环境变量:

1
2
%load_ext dotenv
%dotenv
不过这样也用很繁琐。

使用kernel.json

有一种方法设置起来复杂一些。但一旦设置好,在使用上却是最简便。这就是通过修改kernel.json。

这个文件的内容如下所示:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
{
 "display_name": "Python 2 with environment",
 "language": "python",
 "argv": [
  "/usr/bin/python2",
  "-m",
  "ipykernel_launcher",
  "-f",
  "{connection_file}"
 ],
 "env": {"LD_LIBRARY_PATH":""}
}

最后的"env"字段,显示了如何设置环境变量。如果我们在notebook中要使用tushare, 或者jqdatasdk的账号或者密码,就可以在这个文件中这样设置:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
{
 "display_name": "Python 2 with environment",
 "language": "python",
 "argv": [
  "/usr/bin/python2",
  "-m",
  "ipykernel_launcher",
  "-f",
  "{connection_file}"
 ],
 "env": {"jqdata_account":"myaccount", "jqdata_password": "mypassword"}
}

Tip

tushare和jqdatasdk是两个重要的A股证券数据源。

设置后,重新打开notebook,现在就可以这样访问了:

1
2
3
import os

print(os.environ.get('jqdata_account'))

kernel.json的位置

在单元格中,运行以下命令:

1
!jupyter kernelspec list
我们会得到类似如下的输出:

1
2
Available kernels:
  python3    /usr/local/share/jupyter/kernels/python3
kernle.json就在这个目录里。