在Python 3中防止脚本目录被添加到sys.path

9
有没有办法防止脚本目录在Python3中添加到sys.path?我由于python中的相对导入而遇到了导入冲突。我正在处理一个旧项目,该项目在脚本的根目录中有一个名为logger.py的文件,与内置的logger发生冲突。
我使用的自定义构建系统最终会创建所有文件和依赖项的符号链接,而在生产环境中,我们使用-E标志忽略任何系统设置的PYTHONPATH并将路径设置为我们想要的路径。但是,在PyCharm中运行测试/脚本会因此冲突而无法正常工作。

你的意思是什么?你是想避免将工作目录添加到其中吗?还是你想要打破包导入?无论如何,这听起来像是你的项目出了问题。你应该重构它以使用virtualenv。 - Bakuriu
我希望脚本目录不会出现在sys.path中。就像wpercy所建议的那样,我可以从sys.path中删除该目录(通常是sys.path的第一个元素)。我同意项目已经损坏了,不幸的是这个构建系统是老系统,我不能简单地重构它。 - fo_x86
2个回答

3
"

-I 选项用于隔离模式 是在 Python 3.4 中 添加的。在隔离模式下,脚本目录不会被添加到 sys.path,但还有其他限制,例如忽略用户的 site-packages 目录(-s 选项),以及所有的 PYTHON* 环境变量(-E 选项)。

Python 3.11 有一个 -P 选项 和一个 PYTHONSAFEPATH 变量,可以防止将脚本目录或其他潜在不安全的路径添加到 sys.path 中。

"
在Windows中,._pth文件可用于完全覆盖sys.path并激活隔离模式。此技术用于Windows可嵌入包

2
在你的脚本顶部,你可以尝试做这样的事情:
import os
import sys

# the first element of sys.path is an empty string, meant to represent the current directory
sys.path.remove('')

然后进行常规导入。

请注意,这将导致您当前目录中的所有相对导入失败,可能会引起比您的旧版logger.py更多的问题。

关于您的第二个问题,是否有任何方法可以防止在第一次添加目录到sys.path时,短暂地将其添加到sys.path中,答案是否定的。来自Python 3文档“模块搜索路径”的信息如下:

sys.path从以下位置初始化:

  • 包含输入脚本的目录(或未指定文件时的当前目录)。
  • PYTHONPATH(一个目录名称列表,具有与shell变量PATH相同的语法)。
  • 安装相关的默认值。


我想您可以设置一个符号链接,将您当前的工作目录链接到另一个目录,将实际的脚本放在那里,并将符号链接指向它。同样来自上述文档(我强调):

在支持符号链接的文件系统中,输入脚本所在的目录是在跟随符号链接之后计算的。

这是我现在正在做的事情,想知道是否有任何Python解释器标志或环境变量可以设置,以防止脚本目录被放入sys.path。 - fo_x86
简短的回答是不行,你不能传递任何东西给解释器来防止它将脚本所在的目录添加到 sys.path 中。Python3文档中的“模块搜索路径” - wpercy
针对@fo_x86的问题,根据文档,您可以添加“-P”标志:https://docs.python.org/3/using/cmdline.html#cmdoption-P - Gabor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接