如何防止Python在当前工作目录中搜索模块?

Ben*_* Du 5 python shell module path python-import

我有一个导入datetime模块的 Python 脚本。它工作得很好,直到有一天我可以在一个包含名为 的 Python 脚本的目录中运行它datetime.py。当然,有几种方法可以解决这个问题。首先,我在不包含该脚本的目录中运行该脚本datetime.py。其次,我可以重命名Python脚本datetime.py。然而,这两种方法都不是完美的方法。假设一个人发布了一个 Python 脚本,他永远不知道用户将在哪里运行该 Python 脚本。另一个可能的修复方法是阻止 Python 在当前工作目录中搜索模块。我尝试删除空路径('' ) sys.path,但它在交互式 Python shell 中有效,但在 Python 脚本中无效。调用的 Python 脚本仍然在当前路径中搜索模块。我想知道是否有什么方法可以禁止Python在当前路径中搜索模块?

if __name__ == '__main__':
    if '' in sys.path:
        sys.path.remove('')
    ...
Run Code Online (Sandbox Code Playgroud)

请注意,即使我将以下代码放在脚本的开头,它也不起作用。

import sys
if '' in sys.path:
    sys.path.remove('')
Run Code Online (Sandbox Code Playgroud)

以下是 StackOverflow 上的一些相关问题。

从Python搜索模块路径中删除路径

当 io.py 位于同一目录时,pandas ImportError C 扩展

多数组的初始化引发了未报告的异常python

cax*_*atl 5

您确定 Python 正在当前目录中而不是脚本目录中搜索该模块吗?我不认为 Python 会将当前目录添加到 中sys.path,除非在一种情况下。这样做甚至可能存在安全风险(类似于.UNIX 上的安全风险PATH)。

\n\n

根据文档

\n\n
\n

在程序启动时初始化,该列表的第一项 path[0] 是包含用于调用 Python 解释器的脚本的目录。如果脚本目录不可用(例如,如果交互调用解释器或者从标准输入读取脚本),path[0] 是空字符串,它指示 Python 首先搜索当前目录中的模块

\n
\n\n

因此,\'\'只有在从解释器运行(这就是交互式 shell 测试工作的原因)或从标准输入(类似cat modquest/qwerty.py | python)读取脚本时,才会出现当前目录的表示。一般来说,这两种方式都不是运行 Python 脚本的“正常”方式。

\n\n

我猜测您与实际脚本(在脚本目录datetime.py上)并排站立,并且恰好您正在从该目录运行脚本(即脚本目录==当前目录)。

\n\n

如果这是实际情况,并且您的脚本是独立的(意味着只有一个文件,没有本地导入),您可以这样做:

\n\n
sys.path.remove(os.path.abspath(os.path.dirname(sys.argv[0])))\n
Run Code Online (Sandbox Code Playgroud)\n\n

但请记住,一旦脚本变得更大并且您将其拆分为多个文件,这将在将来困扰您,只会花费几个小时试图找出它为什么不导入本地文件......

\n\n

另一种选择是使用-I,但这可能有点矫枉过正:

\n\n
\n

-我

\n\n

在隔离模式下运行 Python。这也意味着 -E 和 -s。在隔离模式下,sys.path 既不包含 script\xe2\x80\x99s 目录,也不包含 user\xe2\x80\x99s site-packages 目录。所有 PYTHON* 环境变量也将被忽略。可能会施加进一步的限制以防止用户注入恶意代码。

\n
\n