考虑这样一个Python项目:foo/
__init__.py
scripts/
run.py
demo.sh
在正常情况下,尝试从foo包导入将
如果从项目的根目录运行脚本,则失败,因为默认的Python
行为是添加调用Python解释器的脚本的目录
(不一定是当前目录)到sys.path。
(docs):
^{pr2}$
然而,我最近注意到,这种进口正在我的盒子上工作,我
追踪到一些与Python有关的令人惊讶的行为。在我的狂欢中
我在PYTHONPATH中添加了一个目录:export PYTHONPATH="/some/path:$PYTHONPATH"
如果PYTHONPATH最初是空的,那么(有点草率,但很常见)
命令的格式将在后面留下冒号:echo $PYTHONPATH
/some/path:
我一直以为后面的标点没有影响,但是
似乎尾部的结肠是神秘成功的原因
导入。前导或尾随冒号(甚至是已定义但空的PYTHONPATH)
将导致sys.path在{}之前包含一个空字符串模块加载,这又会导致添加当前工作目录
到sys.path。在
下面是要演示的Python脚本和Bash脚本。我也一样
同时使用Python2.7和Python3.3的行为。在
Python脚本:run.py:import sys, os
pp = ('PYTHONPATH')
try:
import foo
print 'OK'
wd() in sys.path
assert pp == '' or pp.startswith(':') dswith(':')
except Exception:
print 'FAIL'
wd() 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
我的问题:我对形势的理解是正确的,还是我误入歧途了?
这有记录吗?我什么也没找到。至少,我是
把这些信息贴在这里,以防对其他人有所帮助。
只有我一个人发现这种行为出乎意料吗?
本文发布于:2024-02-05 06:07:08,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170725872363693.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |