编程语言
首页 > 编程语言> > 为什么带尾随冒号的PYTHONPATH将当前目录添加到sys.path?

为什么带尾随冒号的PYTHONPATH将当前目录添加到sys.path?

作者:互联网

考虑像这样的Python项目:

foo/
    __init__.py
scripts/
    run.py
demo.sh

在正常情况下,尝试从foo包导入将会
如果您从项目的根目录运行脚本,则会失败,因为默认的Python
行为是添加调用Python解释器的脚本目录
(不一定是当前目录)到sys.path.
(docs):

python scripts/run.py

但是,我最近注意到这样的进口正在我的盒子上工作,我
追踪它与PYTHONPATH相关的一些令人惊讶的行为.在我的Bash中
我已经为PYTHONPATH添加了一个目录:

export PYTHONPATH="/some/path:$PYTHONPATH"

如果PYTHONPATH最初是空的,那(有点草率,但常见)
命令的形式将留下一个尾随冒号:

echo $PYTHONPATH
/some/path:

我一直认为这个尾随标点没有影响,但它
似乎结尾的结肠是神秘成功的原因
进口.前导或尾随冒号(甚至是定义但空的PYTHONPATH)
将导致sys.path在站点之前包含空字符串
模块加载,这反过来导致添加当前工作目录
到sys.path.

这是一个Python脚本和一个Bash脚本来演示.我也一样
使用Python 2.7和Python 3.3的行为.

Python脚本:run.py:

import sys, os

pp = os.environ.get('PYTHONPATH')

try:
    import foo
    print 'OK'
    assert os.getcwd() in sys.path
    assert pp == '' or pp.startswith(':') or pp.endswith(':')

except Exception:
    print 'FAIL'
    assert os.getcwd() not in sys.path
    assert pp is None

Bash脚本:demo.sh:

# Import fails.
unset PYTHONPATH;  python scripts/run.py

# Import succeeds -- to my surprise.
PYTHONPATH=''      python scripts/run.py
PYTHONPATH='/tmp:' python scripts/run.py
PYTHONPATH=':/tmp' python scripts/run.py

我的问题:

>我是否正确了解情况,或者我不知何故误入歧途?
>这是否记录在任何地方?我没找到任何东西.至少,我是
在此发布此信息以防其他人.
>我是否一个人发现这种行为出乎意料?

解决方法:

修改冒号分隔的环境变量时,如PYTHONPATH,PATH,CPATH,MANPATH,LD_LIBRARY_PATH,PKG_CONFIG_PATH等等……其中一些变量对尾随冒号有特殊意义,而其他变量则没有.

对于PYTHONPATH和PATH,如果变量先前未设置,我建议以不会意外引入尾随(或前导)冒号的方式预先添加(或追加)新目录:

export PYTHONPATH="/some/path${PYTHONPATH+":"}${PYTHONPATH-}"

(在MANPATH和INFOPATH的情况下,您确实想要引入一个尾部冒号,以便man和info将包含它们的默认搜索目录.)

说明:

> ${PYTHONPATH“:”}扩展为:如果设置了PYTHONPATH,则无论PYTHONPATH是否为空.
> ${PYTHONPATH-}将扩展为PYTHONPATH的内容(如果已设置),但如果未设置PYTHONPATH,则${PYTHONPATH-}会扩展为空 – 就像通常的${PYTHONPATH}一样.

> ${PYTHONPATH-}与${PYTHONPATH-“”}相同,意思是在未设置PYTHONPATH时替换“”(无).
>我推荐${PYTHONPATH-}超过${PYTHONPATH}的原因是${PYTHONPATH-}在PYTHONPATH未设置且脚本执行set -u以提高未设置变量的错误时不会产生错误.

有关${parameter [word]}和${parameter- [word]}机制的详细信息,请参阅http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_02中的“参数扩展”

有关set -u的详细信息,请参阅http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#set中“set”的说明

标签:python,import,pythonpath,sys-path
来源: https://codeday.me/bug/20190628/1314265.html