跳至主要内容

数据科学家的环境变量指南

作为数据科学家,您可能需要在本地或平台上为数据科学项目配置环境变量(局部或全局)。本指南将向您展示所有必备知识!
Eric Ma
Eric Ma

创建您的免费账户

实践并学习路径你的进步。

使用 Google 继续继续即表示您接受我们的 使用条款,我们的 隐私政策 ,并且您的数据存储在美国。

您可能遇到过某个软件请求修改您的 PATH 变量的权限,或者某个程序的安装说明神秘地告诉您必须“正确设置 LD_LIBRARY_PATH 变量”。

作为数据科学家,在与您的计算栈交互时(尤其当您无法完全掌控它时,就像我常遇到的那样),也可能会遇到其他环境变量相关的问题。本文旨在揭开环境变量的神秘面纱,并介绍它在数据科学情境中的用法。

什么是环境变量?

首先,我将通过深入讲解 PATH 环境变量来说明什么是环境变量。我鼓励您在自己的 bash 终端中执行这里的命令(需要适当修改——阅读文字来理解我在做什么!)。

当您登录到计算机系统时,比如本机的终端或通过 SSH 登录远程服务器,您的 bash 解释器需要知道到哪里去寻找某些程序,例如 nano(文本编辑器)、git(版本控制软件)或您的 Python 可执行文件。这由您的 PATH 变量控制。它指定了可执行程序所在文件夹的路径。

按照历史约定,命令行程序(如 nano、which 和 top)通常位于 /usr/bin 目录下。(历史约定中,/bin 文件夹用于存放二进制可执行文件,因此命名为 /bin。)这些是与操作系统捆绑的程序,因此升级时需要特殊权限。

在终端中试试:

$ which which
/usr/bin/which
$ which top
/usr/bin/top

还有一些程序(出于某些原因)会被安装到 /bin 下。比如 ls:

$ which ls
/bin/ls

也有程序可能安装在其他特殊目录:

$ which nano
/usr/local/bin/nano

那么 Bash 终端如何知道到哪里寻找程序?它使用的就是 PATH 环境变量。它看起来像这样:

$ echo $PATH
/usr/bin:/bin:/usr/local/bin

关于 PATH 变量,最重要的是要记住它是“用冒号分隔”的。也就是说,每个目录路径之间用“冒号”(:)字符分隔。bash 终端查找程序的顺序是从左到右:

  • /usr/bin
  • /bin
  • /usr/local/bin

在我的电脑上,当我输入 ls 时,bash 解释器会先查看 /usr/bin 目录。发现 ls 不在 /usr/bin 中,于是会继续查看下一个目录 /bin。由于我的 ls 位于 /bin,它就会从那里执行 ls 程序。

由此可见,这种机制既能让您高度定制计算环境,又可能在某个程序悄悄修改了您的 PATH 变量时带来极大困扰。

等等,PATH 变量是可以修改的?是的,而且有几种方式。

如何修改 PATH 变量

在 Bash 会话中使用

第一种方式是短暂的、临时的,仅对当前的 bash 会话生效。您可以通过将某个文件夹“前置”到 PATH 变量中,让它的优先级高于现有路径:

$ export PATH=/path/to/my/folder:$PATH
$ echo $PATH
/path/to/my/folder:/usr/bin:/bin:/usr/local/bin

或者通过将其“追加”到 PATH 变量末尾,让它的优先级低于现有路径:

$ export PATH=$PATH:/path/to/my/folder
$ echo $PATH
/usr/bin:/bin:/usr/local/bin:/path/to/my/folder

这是临时的原因在于,您只在当前 bash 会话中导出了该设置。

bashrc 或 .bash_profile 文件

如果我希望让更改相对更持久一些,就会把它写进 .bashrc 或 .bash_profile 文件中。(我建议使用 .bashrc 文件。).bashrc/.bash_profile 文件位于您的主目录(由 $HOME 环境变量指定),bash 解释器在初次加载时会执行该文件中的内容。也就是说,您可以通过在 .bashrc 中加入以下内容来修改 PATH 变量:

...other stuff above...
# Make /path/to/folder have higher priority
export PATH=/path/to/folder:$PATH

# Make /path/to/other/folder have lower priority
export PATH=$PATH:/path/to/folder
...other stuff below...

数据科学与 PATH 环境变量

那么,这与数据科学家有什么关系?如果您是数据科学家,很可能使用 Python,而且 Python 解释器来自 Anaconda Python 发行版(强烈推荐,确实很棒!)。Anaconda 安装程序会将 /path/to/anaconda/bin 文件夹优先放在 PATH 环境变量的前面。您的系统里可能还装有其他 Python 解释器(例如 Apple 自带的)。不过,这一 PATH 修改可确保每次您在 Bash 终端输入 python 时,执行的都是 Anaconda 发行版提供的 Python 解释器。就我而言,安装 Anaconda 后,我的 PATH 如下所示:

$ echo $PATH
/Users/ericmjl/anaconda/bin:/usr/bin:/bin:/usr/local/bin

更进一步,conda 环境在被激活时,会将该环境的可执行文件目录预先添加到路径最前面。例如,我的博客项目放在名为 lektor 的环境中。因此……

$ echo $PATH
/Users/ericmjl/anaconda/bin:/usr/bin:/bin:/usr/local/bin
$ which python
/Users/ericmjl/anaconda/bin/python
$ source activate lektor
$ echo $PATH
/Users/ericmjl/anaconda/envs/lektor/bin:/Users/ericmjl/anaconda/bin:/usr/bin:/bin:/usr/local/bin
$ which python
/Users/ericmjl/anaconda/envs/lektor/bin/python

请注意,bash 终端现在会优先选择位于更高优先级的 lektor 环境中的 Python。

读到这里,您应该已经意识到这里提到了几个重要概念。我们来回顾一下:

  • PATH 是一个以纯文本字符串存储的环境变量,bash 解释器用它来确定到哪里寻找可执行程序。
  • PATH 用冒号分隔;优先级更高的目录位于字符串左侧,优先级更低的目录位于右侧。
  • 可以通过在环境变量中前置或追加目录来修改 PATH。可以在 bash 会话中通过在命令行运行 export 命令临时修改;也可以通过在 .bashrc 或 .bash_profile 中添加 export 行来在多个 bash 会话间永久生效。

其他值得关注的环境变量

那么,数据科学家还可能遇到哪些环境变量?以下是一些示例,您可能会见到并需要修复它们,尤其是在系统管理员正在度假(或响应太慢)的情况下。

通用用途:您一定要知道自己的 HOME 文件夹在哪里——在 Linux 系统上通常是 /home/username,在 macOS 系统上通常是 /Users/username。您可以通过以下方式查看 HOME:

$ echo $HOME
/Users/ericmjl

如果您是 Python 用户,PYTHONPATH 可能会很有用。它由 Python 解释器使用,用于指定查找 Python 模块/包的位置。

如果您需要处理 C++ 库,了解 LD_LIBRARY_PATH 环境变量就非常重要了。我对这方面不够精通,无法给出更深入的建议,因此关于如何最佳使用 LD_LIBRARY_PATH,我建议参考这个网站。

如果您使用 Spark,则 PYSPARK_PYTHON 环境变量值得关注。它主要告诉 Spark 其 driver 和 workers 应该使用哪个 Python;如有需要,您也可以将 PYSPARK_DRIVER_PYTHON 设置为不同于 PYSPARK_PYTHON 的值。

玩转环境变量

精彩之处在这里!跟着下面的内容,看看如何通过调整环境变量来实现一些有用的小招。

技巧一:启用对 PyPy 的访问。我偶尔会关注 PyPy 的进展,但由于 PyPy 还不是默认的 Python 解释器,也还不能通过 conda install 安装,我会把它放在自己的 $HOME/pypy/bin 目录下。为了能够使用 PyPy 解释器,我需要确保 /path/to/pypy 出现在 PATH 环境变量中,但优先级低于常用的 CPython 解释器。

技巧二:启用对其他语言解释器/编译器的访问。这与 PyPy 的做法类似。我曾尝试过 Lua 的 JIT 解释器来使用 Torch 进行深度学习,因此需要在 .bashrc 中加入相应路径。

技巧三:将 Python 包安装到您的主目录。在使用 modules 系统而非 conda 环境的共享 Linux 计算系统上,您加载的 modulefile 可能配置了一个您“无权修改”的虚拟环境。如果您需要安装某个 Python 包,可以使用 pip install --user my_pkg_name。这会将其安装到 $HOME/.local/lib/python-[version]/site-packages/。在这种情况下,确保 PYTHONPATH 将 $HOME/.local/lib/python-[version]/site-packages 置于足够高的优先级就很重要。

技巧四:出错时的调试。如果出现错误或行为异常——我之前遇到过在加载了一堆 Linux 模块后找不到正确的 Python 解释器——一种调试方式是临时将 PATH 环境变量设置为某个“合理的默认值”,并通过 source 该设置,从而“重置” PATH 变量,再在调试时手动前置/追加路径。

为此,请在主目录中新建名为 .path_default 的文件,并写入以下两行:

export PATH=""  # resets PATH to an empty string.
export PATH=/usr/bin:/bin:/usr/local/bin:$PATH  # this is a sensible default; customize as needed.

在出现问题后,您可以使用 “source” 命令重置 PATH 环境变量:

$ echo $PATH
/some/complicated/path:/more/complicated/paths:/really/complicated/paths
$ source ~/.path_default
$ echo $PATH
/usr/bin:/bin:/usr/local/bin

注意——您也可以在 bash 会话中直接执行相同的命令;交互式操作有时也很有帮助。

结语

希望您喜欢这篇文章,也希望每当您遇到环境变量相关问题时,它都能为您提供一条——咳咳——明晰的“路径”!

主题