设置pythonpath的Bash脚本

时间:2018-06-17 10:37:02

标签: python bash

mssql-cli使用以下bash脚本来执行实际的python脚本。据我了解代码,while循环确定执行的脚本的当前目录,然后将此路径添加到PYTHONPATH。 当前目录中没有.py文件,为什么路径被添加到PYTHONPATH?有人可以向我解释一下脚本的第一部分是做什么的。谢谢你帮助我。

b:defaultwidgetversion

1 个答案:

答案 0 :(得分:1)

想知道这是否仍然与您相关,但我将其标记为一个有趣的难题,以后再访问...长话短说:它添加了此脚本文件的位置目录,所有符号链接都已解析(未获取文件名或指向该目录的目录都不是指向PYTHONPATH的符号链接。

与使用readlink(或realpath)这样做基本上是相同的:

export PYTHONPATH="$(dirname $(readlink -f ${BASH_SOURCE})):${PYTHONOATH}"

逐行解剖:

SOURCE="${BASH_SOURCE[0]}"

这会将SOURCE设置为调用或来源此脚本的路径。

while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink

如果SOURCE路径引用符号链接,则进入wile循环。即该文件的第一个迭代中是一个符号链接。随后,如果这是指向另一个链接的链接。

  DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"

(对-P的简化解释)更改为目录,其中SOURCE沿路径解析符号链接(即,链接指向/正在指向的目录)更改后打印工作目录(绝对路径)。所有发生在子shell中的结果都分配给变量DIR

  SOURCE="$(readlink "$SOURCE")"

SOURCE分配了由符号链接解析产生的新路径值。从字面上看,链接所指向的目标是相对的或绝对的(例如,ls -l所见)。

  [[ $SOURCE != \/* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located

如果我们通过符号链接解析获得的SOURCE值不是以/开头(即绝对路径),则DIRSOURCE所在的目录我们已进入循环的位置)和已解析的符号链接SOURCE/上串联起来,形成一个新的SOURCE(我们将其置于绝对路径中),然后回到顶部这个循环。注意:在这种情况下,/\的转义似乎是不必要和任意的。

done

完成后。 SOURCE指向不是符号链接的文件。此时,它的路径可能仍包含符号链接,下一步将对其进行处理。

DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"

再一次,就像在循环中一样。 DIR现在应该指向已解析(不是符号链接)SOURCE文件(最初称为/源文件的目标)所在的目录。

# Set the python io encoding to UTF-8 by default if not set.
if [ -z ${PYTHONIOENCODING+x} ]; then export PYTHONIOENCODING=utf8; fi

如果未设置 shell 变量或等于空字符串,则导出 environmental 变量。注意:${PYTHONIOENCODING+x}似乎是${PYTHONIOENCODING:+x}的另一种形式,其使用似乎绝对是任意的。还有一种测试可以检查是否设置了变量(无论其值如何)。

export PYTHONPATH="${DIR}:${PYTHONPATH}"

PYTHONPATH现在设置为从绝对解析路径(此路径所指向的文件)所在的绝对解析路径(路径中的任何位置都不应有符号链接)开始。

python -m mssqlcli.main "$@"

调用python ...