关于python import的sys.path路径问题

关于python import的sys.path路径问题

sys.path

先说一下 sys.path 这个变量,该变量需要导入 sys 官方库方可使用,它是一个列表,是当前 python 文件 import 库时会逐个搜索列表中的路径。

初始化

sys.path 从这些位置初始化:

  • 包含输入脚本的目录(或当前目录,当没有指定文件时)
  • PYTHONPATH(目录名列表,与 shell 变量 PATH 语法相同)
  • 与安装相关的默认值(比如当前conda环境的路径)

添加

为了解决上述问题,需要添加模块搜索路径,可以使用以下几种方式:

  • 动态增加路径

    临时生效,对于不经常使用的模块,这通常是最好的方式,因为不必用所有次要模块的路径来污染 PYTHONPATH。

    import sys
    sys.path.append('/home/song/mylib')
    
  • 修改 PYTHONPATH 变量

    永久生效,对于在许多程序中都使用的模块,可以采用这种方式。这将改变所有 Python 应用的搜索路径,因为启动 Python 时,它会读取这个变量,甚至不同版本的 Python 都会受影响。

    export PYTHONPATH=$PYTHONPATH:/home/song/mylib
    

    直接命令行执行则当前终端生效,或添加到 ~/.bashrc 中并 source 永久生效。

  • 增加 .pth 文件

    永久生效,这是最简单的、也是推荐的方式。Python 在遍历已知的库文件目录过程中,如果遇到 .pth 文件,便会将其中的路径加入到 sys.path 中,于是 .pth 中所指定的路径就可以被 Python 运行环境找到了。

    /usr/local/lib/python3.5/site-packages 下添加一个扩展名为 .pth 的配置文件(例如:extras.pth),内容为要添加的路径:/home/song/mylib

例子

考虑这样一个目录结构,他基本涵盖我们 python 文件 import 自定义库时的情况:

.
├── lib1.py
├── t1
│   ├── lib0.py
│   └── test.py
└── t2
    └── lib2.py

我们的 test.py 想要 import lib0、1、2.py 三个库文件,并且,我们要考虑在 test.py 的当前目录运行(python test.py) 或其父目录运行(python t1/test.py)时,分别应该怎么做呢?

导入lib0

当前目录运行

首先要明确,我们的 python 程序在考虑相对路径时,考虑的是文件所在目录的相对路径,而不是工作目录的路径。所以我们直接导入即可:

import lib0

父目录运行

刚才提到这不受到工作目录影响,所以同上。

导入lib1

当前目录运行

我们都知道,要导入上级目录的文件,可以通过在 sys.path 中追加上级目录 .. 来实现。另一个关键点就在这里,sys.path 中的相对路径是相对工作目录而言的,而不是相对文件所在目录。因此我们在当前目录运行时:

import sys
sys.append('..')

import lib1

运行:python test.py

父目录运行

注意这里就有所不同了,因为 sys.path 是相对工作目录而言的,我们在父目录运行程序,工作目录变化了,因此应该:

import sys
sys.append('.')

import lib1

导入lib2

实际导入 lib2 就与导入 lib1 类似,只是多一级即可

当前目录运行

import sys
sys.append('..')

import t2.lib1

父目录运行

import sys
sys.append('.')

import t2.lib1

Ref:

Python 模块搜索路径

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 当您使用Python编写脚本时,如果您想要导入位于其他目录中的模块,您需要将该模块所在目录添加到Python的模块搜索路径中。这可以通过使用sys模块中的path属性来实现。以下是一个示例: ```python import sys # 添加模块搜索路径 sys.path.append('/path/to/module') # 导入模块 import module ``` 在这个例子中,我们将模块所在的路径添加到sys.path中,然后使用import语句导入模块。添加模块搜索路径的方法可以让Python解释器在搜索模块时查找指定的目录,从而使我们可以成功导入位于其他目录中的模块。 ### 回答2: Pythonsys.path.append是一个很重要的操作,其作用是动态添加模块搜索路径,以便在程序中使用某些模块时,可以从指定的路径中寻找该模块。 在Python中,当我们引用某个模块时,Python会搜索一个叫做sys.path路径列表,来寻找该模块。这个列表可以通过sys.path.append来动态添加新的路径。如果在此列表中找不到该模块,Python会抛出ImportError异常。 sys.path.append()可以在Python运行时动态添加指定目录sys.path中,使Python程序在运行时能够查找该目录下的模块。这个方法是Python中非常常用的方法之一,它可以用于自定义模块的位置,让Python解释器在自定义的目录中查找模块。 sys.path.append()方法接受一个路径字符串作为参数,这个路径字符串可以是相对路径或绝对路径。当我们调用该方法添加新路径时,Python会自动将这个路径添加到sys.path列表的最后一个元素中,这样Python程序就可以在此路径中查找模块了。 值得注意的是,每个Python程序都有一个默认的sys.path列表,这个列表由Python安装时自动配置,它包括Python安装目录下的路径Python标准所在路径sys.path列表并不是可修改的,因此我们需要动态添加新路径。 总之,sys.path.append()方法是一个非常有用的方法,可以方便地添加新模块搜索路径,使Python程序可以访问新路径下的模块。在实际开发中,我们可以根据需要动态添加新路径,来满足不同的需求。 ### 回答3: `sys.path` 是Python的module search path,通过它可以找到模块(.py文件)所在的路径,从而使Python代码中能够正确地导入和使用这些模块。Python在启动时会设置一组默认的搜索路径,在其中包括了Python标准、安装的第三方以及当前目录。 `sys.path.append()` 是一种常见的修改`sys.path` 的方式,它可以将一个新的目录添加到`sys.path` 中,从而允许Python在这个目录中查找模块。使用 `sys.path.append()`,我们可以手动指定目录,这个目录可以包括我们自己的Python代码和第三方。 `sys.path.append()` 的语法非常简单,只需要传递一个字符串参数,即要添加的目录路径。例如,假设你的项目代码存放在目录 `/home/user/myproject` 中,你可以通过以下代码添加该目录到`sys.path`中: ``` import sys sys.path.append('/home/user/myproject') ``` 使用`sys.path.append()`添加目录到`sys.path`中并不是一个常见的做法,因为它有一些缺点。如果我们在多个地方都使用`sys.path.append()`添加目录,那么系统路径会变得很长,很难维护。此外,如果不小心添加了一个路径错误的目录,可能会导致Python在运行时无法找到需要的模块,这会让我们非常头痛。 相较于`sys.path.append()`,更好的做法是将Python代码和相关的第三方集中到一个虚拟环境中,并将这个虚拟环境作为Python解释器的默认环境。这样,我们就可以方便地管理Python依赖关系,同时也可以避免出现系统路径过长和目录错误的问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值