您可能遇到过某个软件请求修改您的 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 会话中直接执行相同的命令;交互式操作有时也很有帮助。
结语
希望您喜欢这篇文章,也希望每当您遇到环境变量相关问题时,它都能为您提供一条——咳咳——明晰的“路径”!
您可能遇到过某个软件请求修改您的
PATH变量的权限,或者某个程序的安装说明神秘地告诉您必须“正确设置LD_LIBRARY_PATH变量”。作为数据科学家,在与您的计算栈交互时(尤其当您无法完全掌控它时,就像我常遇到的那样),也可能会遇到其他环境变量相关的问题。本文旨在揭开环境变量的神秘面纱,并介绍它在数据科学情境中的用法。
什么是环境变量?
首先,我将通过深入讲解
PATH环境变量来说明什么是环境变量。我鼓励您在自己的 bash 终端中执行这里的命令(需要适当修改——阅读文字来理解我在做什么!)。当您登录到计算机系统时,比如本机的终端或通过 SSH 登录远程服务器,您的 bash 解释器需要知道到哪里去寻找某些程序,例如
nano(文本编辑器)、git(版本控制软件)或您的 Python 可执行文件。这由您的 PATH 变量控制。它指定了可执行程序所在文件夹的路径。按照历史约定,命令行程序(如
nano、which和top)通常位于/usr/bin目录下。(历史约定中,/bin文件夹用于存放二进制可执行文件,因此命名为/bin。)这些是与操作系统捆绑的程序,因此升级时需要特殊权限。在终端中试试:
还有一些程序(出于某些原因)会被安装到
/bin下。比如ls:也有程序可能安装在其他特殊目录:
那么 Bash 终端如何知道到哪里寻找程序?它使用的就是
PATH环境变量。它看起来像这样:关于
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变量中,让它的优先级高于现有路径:或者通过将其“追加”到
PATH变量末尾,让它的优先级低于现有路径:这是临时的原因在于,您只在当前 bash 会话中导出了该设置。
bashrc或.bash_profile文件如果我希望让更改相对更持久一些,就会把它写进
.bashrc或.bash_profile文件中。(我建议使用.bashrc文件。).bashrc/.bash_profile文件位于您的主目录(由$HOME环境变量指定),bash 解释器在初次加载时会执行该文件中的内容。也就是说,您可以通过在.bashrc中加入以下内容来修改 PATH 变量:数据科学与
PATH环境变量那么,这与数据科学家有什么关系?如果您是数据科学家,很可能使用 Python,而且 Python 解释器来自 Anaconda Python 发行版(强烈推荐,确实很棒!)。Anaconda 安装程序会将
/path/to/anaconda/bin文件夹优先放在PATH环境变量的前面。您的系统里可能还装有其他 Python 解释器(例如 Apple 自带的)。不过,这一PATH修改可确保每次您在 Bash 终端输入python时,执行的都是 Anaconda 发行版提供的 Python 解释器。就我而言,安装 Anaconda 后,我的PATH如下所示:更进一步,conda 环境在被激活时,会将该环境的可执行文件目录预先添加到路径最前面。例如,我的博客项目放在名为
lektor的环境中。因此……请注意,bash 终端现在会优先选择位于更高优先级的
lektor环境中的 Python。读到这里,您应该已经意识到这里提到了几个重要概念。我们来回顾一下:
PATH是一个以纯文本字符串存储的环境变量,bash 解释器用它来确定到哪里寻找可执行程序。PATH用冒号分隔;优先级更高的目录位于字符串左侧,优先级更低的目录位于右侧。PATH。可以在 bash 会话中通过在命令行运行export命令临时修改;也可以通过在.bashrc或.bash_profile中添加export行来在多个 bash 会话间永久生效。其他值得关注的环境变量
那么,数据科学家还可能遇到哪些环境变量?以下是一些示例,您可能会见到并需要修复它们,尤其是在系统管理员正在度假(或响应太慢)的情况下。
通用用途:您一定要知道自己的
HOME文件夹在哪里——在 Linux 系统上通常是/home/username,在 macOS 系统上通常是/Users/username。您可以通过以下方式查看HOME:如果您是 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的文件,并写入以下两行:在出现问题后,您可以使用 “source” 命令重置 PATH 环境变量:
注意——您也可以在 bash 会话中直接执行相同的命令;交互式操作有时也很有帮助。
结语
希望您喜欢这篇文章,也希望每当您遇到环境变量相关问题时,它都能为您提供一条——咳咳——明晰的“路径”!