如何在Python中使用Sys.path.append()

3,397 阅读5分钟

Sys.path 是 Python 解释器搜索模块的目录列表。请注意,这是一个列表!当项目文件中声称有一个模块时,它将搜索列表中的每一个目录。如果模块位于这些目录中的一个,那么一切都很顺利,你的项目就会成功呈现。但是,如果模块不在列表中的任何一个目录内,那么你的项目就会失败,除非你能用append()函数将模块所在的目录 "追加 "到列表中。在本教程中,我们将学习如何在 Python 中使用 sys.path.append() 。

列出当前路径

通过下面的声明,我们可以检查当前的Python路径。

import sys

from pprint import pprint

pprint(sys.path)

在这里,pprint模块只是用来使事情看起来漂亮,所以你可以忽略这部分,而把注意力放在其他部分。我们在这里所要做的就是打印出sys.path。

这就是我们得到的结果。

你在这里注意到的是,首先,它是一个列表。所以根据这个列表,它将首先查找当前工作目录,然后再逐一查找其他目录。当前工作目录是指找到主Python脚本--正在执行的那个--的目录。此外,这也意味着这个列表可以被修改或编辑。

添加一个路径

sys.path.append()方法是专门用来在现有的路径上添加一个路径。

假设现在我有两个不同的文件:main.py和file1.py。main.py 是主文件,我们将尝试导入 file1.py(我们写的一个模块)。

main.pyfile1.py
importfile1

print(file1.secret)

|

secret="这是一个秘密短语"

|

因为 file1.py 或我们的模块在工作目录内,你应该能够成功地打印出秘密句子。之所以如此,是因为当 Python 解释器搜索所请求的模块时,它首先会在工作目录中搜索,由于我们的模块名为 file1,在工作目录内,它将自动打印出我们的秘密句。

现在,假设我在工作目录中创建了一个叫做 "directory1 "的目录,并将我的模块file1放在其中。

现在,在模块file1中是我们要打印出来的密语。在这种情况下,它不会打印出这个密语。为什么?因为解释器并没有在 "directory1 "中寻找任何模块。换句话说,当前工作目录是sys.path列表中的一个成员,但 "directory1 "不是该列表中的成员。因此,产生的错误是ModuleNotFound Error - 它无法找到或定位名为file1的模块。

为了避免这个问题,你需要告诉 Python 解释器在哪里寻找模块 file1。这就是 sys.path.append() 方法的作用。

sys.path.append() 方法用来把我们想要的路径追加到现有的列表中。

在Linux系统中。

sys.path.append("/path/to/dir")

在Windows系统中,你会这样写。

sys.path.append("C:\path\to\\dir")

请注意,你不能向sys.path添加任何指定的文件,相反,你可以添加目录,然后导入你想要的文件。

例子 #1

那么,让我们再次尝试之前的操作(file1模块位于directory1内),但这次我们将使用sys.path.append()方法将file1模块的路径追加到sys.path中。

main.pyfile1.py
import sys

sys.path.append('C:\\Users\never\PycharmProjects\

pythonProject1\directory1')

importfile1

print(file1.secret)

|

secret="这是一个秘密短语"

|

当我们使用sys.path.append()方法追加路径时,我们首先将模块的位置追加到Path中,然后再导入它。如果以这样的方式完成,Python 解释器应该能够找到所请求的模块,从而检索到秘密变量。

前面操作的输出结果如下。

例子 #2

让我们再举一个例子,这次是在 Linux 机器上。假设我们有一个文件 - main.py。

main.py
import sys

from pprint import pprint

pprint(sys.path)

|

这里,sys.path[0]是"/home/kalyani",因为那是main.py的位置。

现在,让我们通过使用sys.path.append()方法对脚本进行一些修改。让我们使用该方法将一个特定的路径('/home/kalyani/directory1')追加到sys.path中。

main.py
import sys

from pprint import pprint

sys.path.append('/home/kalyani/directory1')

pprint(sys.path)

|

所以,sys.path.append()方法将路径追加到了现有列表的末尾!在这里也请注意,append()方法的作用是,将路径追加到现有列表的末尾。这里也请注意,追加是在列表的末尾进行的,而不是在开头。

PYTHONPATH

我们刚才做的事情有一个小问题,那就是我们没有把这个位置永久地放到sys.path列表中。sys.path.append()方法是用来临时添加一个路径的,因此,这个路径对一个会话来说是有效的。如果你想永久地改变sys.path列表,那么我们可以使用PYTHONPATH将该路径添加到列表中。由于sys.path也会查看PYTHONPATH,那么列出的位置就会被包含在路径列表中。

在Linux上。

export PYTHONPATH='/path/to/dir'.

  1. 在你的Linux机器上,打开一个终端,并导航到包含.bashrc的文件夹。

  2. nano .bashrc

  3. 在.bashrc文件的末尾添加以下内容。

    export PYTHONPATH='/home/kalyani/directory1' 。

在这里,你可以添加你想要的路径。

  1. 关闭终端,并打开一个新的终端
  2. 现在,试着执行你的程序。在我的例子中,它将是以下内容。
main.py
import sys

from pprint import pprint

pprint(sys.path)

|

当用Python编写复杂的程序时,我们最终会添加第三方模块,甚至更好的是,创建我们自己的模块。在任何情况下,我们都不能把我们创建的每一个Python文件放在一个目录中,我们可能希望使用多个目录来充分地对我们的文件进行分类。然而问题是,我们可能需要左右导入我们创建的模块。在这种情况下,如果我们想防止出现 ModuleNotFound 错误,那么我们可以使用 sys.path.append() 方法将目录的位置 - 注意,必须是一个目录,而不是一个文件 - 添加到 sys.path。

编码愉快!