sys.path的使用场景
起因
在初学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.pyimport 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的使用场景的更多相关文章
- [项目实践] python文件路径引用的规则,记一次使用sys.path[0]的问题,及如何区分 ../与 ./的使用场景
下面是一个获取配置的代码 def getValue(self,section,option): """ @file: string,the name of the con ...
- sys.path和os.path
sys.path和os.path1.sys.path是python搜索模块的路径集合,是个list:os.path是os的一个模块,是操作文件和目录的模块 2.sys.path和PYTHONPATH首 ...
- python的sys.path
python检测不到模块: No module named 是因为模块没有在sys.path中,查看sys.path的方法 import sys sys.path 发现确实没有加载到模块. windo ...
- Python sys.path.append
python sys.path.append 对于模块和自己写的程序不在同一个目录下,可以把模块的路径通过sys.path.append(路径)添加到程序中. 在程序开头加上: import syss ...
- os.getcwd()、sys.path[0]、sys.argv[0]和__file__的区别,终于弄清楚了
os.getcwd().sys.path[0].sys.argv[0]和__file__的区别 要分清这几个的区别与使用条件,实际测试一下是最准确的. 设计测试方法: 一个主模块用来运行,一个子模块用 ...
- pycharm和shell中的sys.path不一样
用pip安装了一个模块,在pycharm中不能调用,然后发现shell和pycharm中的sys.path不一样. 纳尼?还能不一样? 很明显左边的pycharm的sys.path中少了三个重要的路径 ...
- python:PATH、PYTHONPATH 和 sys.path 的区别
python:PATH.PYTHONPATH 和 sys.path 的区别 共同点 所有在它们的路径里面的 moduel 都可以被 import PATH 在 PATH 中的一些命令,例如 *.exe ...
- Python中的sys.path.append()
当我们导入一个模块时:import xxx,默认情况下python解析器会搜索当前目录.已安装的内置模块和第三方模块 当运行脚本文件和导入模块不再同一目录下 import sys sys.path. ...
- python3 sys.path
wadmin@ansible-test:~/python$ python3Python 3.6.7rc1 (default, Sep 27 2018, 09:51:25) [GCC 8.2.0] on ...
随机推荐
- Elasticsearch学习系列四(聚合搜索)
聚合分析 聚合分析是数据库中重要的功能特性,完成对一个查询的集中数据的聚合计算.如:最大值.最小值.求和.平均值等等.对一个数据集求和,算最大最小值等等,在ES中称为指标聚合,而对数据做类似关系型数据 ...
- QT多线程的简单使用,主线程发一份数据,子线程收两份数据
先看效果图,示例发送数据"Hello World" 主线程:0x16f54aeda20,另两个子线程分别是0x4f1baff690.0x4f1baff6a0 因为在子线程中加了20 ...
- 不存在的!python说不给数据的浏览器是不存在的!
有时候我们些代码是总发此疑惑? 为什么别人采集 xx 网站的时候能成功,而我却总是不返回给数据出现这种原因时往往是我们没有给够伪装, 被识别了出来~ 就像人,你出门肯定是要穿衣服的对不,如果你不穿! ...
- HiEngine:可媲美本地的云原生内存数据库引擎
摘要:HiEngine与华为GaussDB (for MySQL)集成,将内存数据库引擎的优势带到云端,并与基于磁盘的引擎共存.HiEngine的性能比传统的以存储为中心的解决方案高出7.5倍. 本文 ...
- 模电Multisim仿真Rb变化对Q点和电压放大倍数的影响
一.目的 研究Rb变化对Q点和Au的影响. 二.方法描述 仿真电路如下所示.晶体管采用FMMT5179其参数BF=133,RB=5Ω. (1)分別测量Rb=3MΩ和3.2MΩ时得UCEQ和Au.由于信 ...
- HTML 超文本标记语言 (Hyper Text Markup Language)
1.HTML是什么 HTML指的超文本标记语言(Hyper Text Markup Language),是一种用来描述网页的语言.超文本指的是除了可以包含文字之外,还可以包含图片.链接.音乐.视频.程 ...
- 在 SQL Server 中使用 Try Catch 处理异常
如何在 SQL Server 中使用 Try Catch 处理错误? 从 SQL Server 2005 开始,我们在TRY 和 CATCH块的帮助下提供了结构错误处理机制.使用TRY-CATCH的语 ...
- SQLZOO练习二--SELECT from Nobel Tutorial
We continue practicing simple SQL queries on a single table. This tutorial is concerned with a table ...
- SQLZOO练习(一)SELECT BASICS,SELECT form world
name continent area population gdp Afghanistan Asia 652230 25500100 20343000000 Albania Europe 28748 ...
- C++算数运算符和位运算符
C++根据功能和用途将运算符分为算数运算符.位运算符.关系运算符和逻辑运算符等不同类型.四种不同运算符的优先级从大到小依次位算-位-关-逻. 一.算数运算符 1.加减乘除(+ - * /) 加减乘除位 ...