起因

在初学python时,经常遇到找不到某个路径下的文件,或者在博客中找到的代码需要暴露出环境变量(如linux中可以export PYTHONPATH="$PYTHON;/carla/bin"),发现在windows中配置却没办法识别,这时就可以用到sys.path

使用场景

  • 解决import不到文件的问题 ModuleNotFoundError: No module named 'xxxx'

    目录结构
    D:.
    └─t1
    │ └─t11
    │ └─t11_c.py
    └─ test.py

    t11_c.py文件内容

    def example():
    print("t11")

    在test.py中希望直接引用t11_c.py

    from t11_c import example
    example()

    运行后异常:

    Traceback (most recent call last):
    File "D:/python_projects/pythonProject/test_egg/test.py", line 3, in <module>
    from t11_c import example
    ModuleNotFoundError: No module named 't11_c'

    如果将路径加入到系统变量中:

    import sys
    sys.path.append("t1/t11")
    from t11_c import example
    example()
    sys.path.pop(-1)

    执行结果:

    t11

    我们既可以在路径中写文件夹的相对位置,也可以写绝对位置,这为我们跨项目调用包提供了思路

    import sys
    sys.path.append(r"D:\python_projects\pythonProject\test_egg\t1\t11")
    from t11_c import example
    example()
    print(sys.path.pop(-1))

    sys.path.pop(-1) 在退出时清理掉插入的路径,养成良好的习惯

    结论:

    sys.path本质上是一个list,python项目在找引用文件时会在sys.path中挨个寻找

  • 解决包名称相同时,import到自己想要的文件的情况

    这个场景用在将自己写的包放在其他项目时,其他项目中也有和自己项目中引入路径相同的文件,导致引用错误

    目录结构
    D:.
    ├─t2
    │ ├─t21
    │ │ └─main.py
    │ │ └─utils.py
    │ └─__init__.py
    └─test.py
    └─utils.py

    t2/t21/main.py

    from utils import example
    def main():
    example()

    t2/t21/utils.py

    def example():
    print("t22")

    test.py (这里写的是直接拿路径去找,也可以使用python代码从命令行调用)

    from t2.t21.main import main
    if __name__ == '__main__':
    main()

    utils.py

    def t2_test():
    print("main")

    执行test.py:

    Traceback (most recent call last):
    File "D:/python_projects/pythonProject/test_egg/test.py", line 1, in <module>
    from t2.t21.main import main
    File "D:\python_projects\pythonProject\test_egg\t2\t21\main.py", line 1, in <module>
    from utils import example
    ImportError: cannot import name 'example' from 'utils' (D:\python_projects\pythonProject\test_egg\utils.py)

    这里main.py是从根目录下的utils.py中去找example函数,当然找不到。我们可以试着改造main.py,让它在当前目录去找

    main.py

    import sys
    import os
    current_dir_path = os.path.split(os.path.realpath(__file__))[0] # D:\python_projects\pythonProject\test_egg\t2\t21
    sys.path.insert(0, current_dir_path)
    from utils import example
    def main():
    example()
    print(sys.path.pop(0))

    结果:

    D:\python_projects\pythonProject\test_egg\t2\t21
    t22
  • 动态调用想使用的文件

    这个和上面的原理很相似,目录结构
    D:.
    ├─t3
    │ ├─t31
    │ │ └─main.py
    │ └─t32
    │ └─main.py
    └─test.py

    t31/main.py和t32/main.py内容相似只是t31中打印"t31", t32中打印"t32",都是p函数

    def p():
    print("t31")

    test.py:

    import sys
    
    if __name__ == '__main__':
    arg = "t32"
    if arg == "t31":
    path = "t3/t31"
    else:
    path = "t3/t32"
    sys.path.append(path)
    from main import test
    test()
    sys.path.pop(-1)

    arg = "t32" 可以理解为通过参数解析或者函数传参调用

    结果:

    t32
  • 加载egg文件

    这里的egg包是在carla打包时生成的egg包carla-0.9.13-py3.8-win-amd64.egg

    可以这么引入egg包

    test.py:
    import sys
    sys.path.append("carla-0.9.13-py3.8-win-amd64.egg") import carla if __name__ == '__main__':
    print(carla)

    结果

    <module 'carla' from 'carla-0.9.13-py3.8-win-amd64.egg\\carla\\__init__.py'>

sys.path的使用场景的更多相关文章

  1. [项目实践] python文件路径引用的规则,记一次使用sys.path[0]的问题,及如何区分 ../与 ./的使用场景

    下面是一个获取配置的代码 def getValue(self,section,option): """ @file: string,the name of the con ...

  2. sys.path和os.path

    sys.path和os.path1.sys.path是python搜索模块的路径集合,是个list:os.path是os的一个模块,是操作文件和目录的模块 2.sys.path和PYTHONPATH首 ...

  3. python的sys.path

    python检测不到模块: No module named 是因为模块没有在sys.path中,查看sys.path的方法 import sys sys.path 发现确实没有加载到模块. windo ...

  4. Python sys.path.append

    python sys.path.append 对于模块和自己写的程序不在同一个目录下,可以把模块的路径通过sys.path.append(路径)添加到程序中. 在程序开头加上: import syss ...

  5. os.getcwd()、sys.path[0]、sys.argv[0]和__file__的区别,终于弄清楚了

    os.getcwd().sys.path[0].sys.argv[0]和__file__的区别 要分清这几个的区别与使用条件,实际测试一下是最准确的. 设计测试方法: 一个主模块用来运行,一个子模块用 ...

  6. pycharm和shell中的sys.path不一样

    用pip安装了一个模块,在pycharm中不能调用,然后发现shell和pycharm中的sys.path不一样. 纳尼?还能不一样? 很明显左边的pycharm的sys.path中少了三个重要的路径 ...

  7. python:PATH、PYTHONPATH 和 sys.path 的区别

    python:PATH.PYTHONPATH 和 sys.path 的区别 共同点 所有在它们的路径里面的 moduel 都可以被 import PATH 在 PATH 中的一些命令,例如 *.exe ...

  8. Python中的sys.path.append()

    当我们导入一个模块时:import  xxx,默认情况下python解析器会搜索当前目录.已安装的内置模块和第三方模块 当运行脚本文件和导入模块不再同一目录下 import sys sys.path. ...

  9. python3 sys.path

    wadmin@ansible-test:~/python$ python3Python 3.6.7rc1 (default, Sep 27 2018, 09:51:25) [GCC 8.2.0] on ...

随机推荐

  1. Spring Data JPA系列4——Spring声明式数事务处理与多数据源支持

    大家好,又见面了. 到这里呢,已经是本SpringData JPA系列文档的第四篇了,先来回顾下前面三篇: 在第1篇<Spring Data JPA系列1:JDBC.ORM.JPA.Spring ...

  2. 全新升级的AOP框架Dora.Interception[6]: 实现任意的拦截器注册方式

    Dora.Interception提供了两种拦截器注册方式,一种是利用标注在目标类型.属性和方法上的InterceptorAttribute特性,另一种采用基于目标方法或者属性的调用表达式.通过提供的 ...

  3. Linux操作系统(5):网络命令

    Linux 网络环境配置①自动获取 缺点: linux 启动后会自动获取 IP,缺点是每次自动获取的 ip 地址可能不一样.这个不适用于做服务器,因为我们的服务器的 ip 需要时固定的. ②直 接 修 ...

  4. 反向传播神经网络(BP)

    实验部分: ①输入.输出矢量及问题的阐述 由题意输入变量取值范围为e={-2,-1,0,1,2}和ec={-2,-1,0,1,2},则输入矢量有25种情况,分别如下所示: 则由T=int((e+ec) ...

  5. 自己写雪花算法IdWorker

    package com.aiyusheng.shopping.util; import java.lang.management.ManagementFactory; import java.net. ...

  6. Note -「数论 定理及结论整合」

    数学素养 low,表达可能存在不严谨,见谅.我准备慢慢补上证明? Theorems. 裴蜀定理:关于 \(x, y\) 的线性方程 \(ax + by = c\) 有解,当且仅当 \(\gcd (a, ...

  7. 特殊的阻塞队列 - java.util.concurrent.SynchronousQueue 分析

    描述 SynchrounousQueue 是一个比较特殊的无界阻塞队列并支持非公平和公平模式,严格意义上来说不算一个队列,因为它不像其他阻塞队列一样能有容量,它仅有一个指向栈顶的地址,栈中的节点由线程 ...

  8. JavaScript数组方法总结,本文是根据数组原型上的方法进行总结,由于方法太多将会分篇章发布

    通过浏览器控制台 console 可查看到 Array 数组上原型的所有方法(如下图).对于原型问题此文章暂不过多叙述,单针对对象中的方法进行自我看法的总结:细心的同学可以发现对象原型上所携带的方法基 ...

  9. HTTP 协议概述

    什么是 HTTP 协议 什么是协议? 协议是指双方,或多方,相互约定好,大家都需要遵守的规则,叫协议. 所谓 HTTP 协议,就是指,客户端和服务器之间通信时,发送的数据,需要遵守的规则,叫 HTTP ...

  10. Windows环境下部署MySQL主从并模拟升级到8.0

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 一.部署实例 1.下载2个软件 http://ftp.kaist.ac.kr/mysql/Downloads/MySQL- ...