关于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 模块搜索路径

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/532493.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python pdb调试基本命令整理

python pdb调试基本命令整理 使用简介 启动调试 侵入式 在 py 文件内部设置: import pdb; pdb.set_trace()程序会在运行到这一行时停下来,进入 pdb 交互。 非侵入式 在运行 py 脚本时: python -m pdb main.py程序会在一启动时就进入 pdb 交…

Docker概念理解

Docker概念理解 本文非Docker命令大全,而是对Docker的概念、原理等作说明,适合有一定实操经验后来加深理解。 转自:docker从入门到实践 Docker简介 本章将带领你进入 Docker 的世界。 什么是 Docker? 用它会带来什么样的好处&a…

Dockerfile详解

Dockerfile详解 转自:https://yeasy.gitbook.io/docker_practice/ 使用Dockerfile定制镜像 从刚才的 docker commit 的学习中,我们可以了解到,镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操…

Dockerfile最佳实践

Dockerfile最佳实践 本文是原作者对 Docker 官方文档中 Best practices for writing Dockerfiles 的理解与翻译。 转自:附录四:Dockerfile 最佳实践 一般性指南和建议 容器应该是短暂的 通过 Dockerfile 构建的镜像所启动的容器应该尽可能短暂&#xf…

Linux内存背后的那些神秘往事

Linux内存背后的那些神秘往事 作者:大白斯基(公众号:后端研究所) 转自:https://mp.weixin.qq.com/s/l_YdpyHht5Ayvrc7LFZNIA 前言 大家好,我的朋友们! CPU、IO、磁盘、内存可以说是影响计算机…

mmdeploy快速上手

mmdeploy快速上手 若要将使用 openmmlab 的框架(如mmdet、mmcls)等训练的模型进行快速部署,同样来自 openmmlab 的 mmdeploy 无疑是最合适的选择,本文将简单地完成一个 Faster RCNN 模型的部署。 配置 本文基于如下软硬件配置&…

精简CUDA教程——CUDA Driver API

精简CUDA教程——CUDA Driver API tensorRT从零起步迈向高性能工业级部署(就业导向) 课程笔记,讲师讲的不错,可以去看原视频支持下。 Driver API概述 CUDA 的多级 API CUDA 的 API 有多级(下图)&#xff…

CUDA编程入门极简教程

CUDA编程入门极简教程 转自:CUDA编程入门极简教程 作者:小小将 前言 2006年,NVIDIA公司发布了CUDA,CUDA是建立在NVIDIA的CPUs上的一个通用并行计算平台和编程模型,基于CUDA编程可以利用GPUs的并行计算引擎来更加高效地…

精简CUDA教程——CUDA Runtime API

精简CUDA教程——CUDA Runtime API tensorRT从零起步迈向高性能工业级部署(就业导向) 课程笔记,讲师讲的不错,可以去看原视频支持下。 Runtime API 概述 环境 图中可以看到,Runtime API 是基于 Driver API 之上开发的…

Python并发——concurrent.futures梳理

Python并发——concurrent.futures梳理 参考官方文档: concurrent.futures — 启动并行任务 Executor对象 class concurrent.funtures.Executor该抽象类是 ThreadPoolExecutor 和 ProcessPoolExecutor 的父类,提供异步执行调用方法。要通过它的子类调用…

TensorRT ONNX 基础

TensorRT ONNX 基础 tensorRT从零起步迈向高性能工业级部署(就业导向) 课程笔记,讲师讲的不错,可以去看原视频支持下。 概述 TensorRT 的核心在于对模型算子的优化(合并算子、利用当前 GPU 特性选择特定的核函数等多种…

回文子串、回文子序列相关题目

回文子串、回文子序列相关题目 回文子串是要连续的,回文子序列可不是连续的。 516. 最长回文子序列 dp数组含义:dp[i][j]dp[i][j]dp[i][j] 表示子序列 s[i,j]s[i,j]s[i,j] 中的最长回文子序列的长度。 dp数组初始化:子序列长度为 1 时&am…

mmdetection tools工具梳理

mmdetection tools工具梳理 mmdetection 是一个非常好用的开源目标检测框架,我们可以用它方便地训练自己的目标检测模型,mmdetection 项目仓库提供许多实用的工具来实现帮助我们进行各种测试。本篇将梳理以下 mmdetection 项目仓库 tools 目录下的各种实…

TensorRT ONNX 基础(续)

TensorRT ONNX 基础(续) PyTorch正确导出ONNX 几条推荐的原则,可以减少潜在的错误: 对于任何使用到 shape、size 返回值的参数时,例如 tensor.view(tensor.size(0), -1) 这类操作,避免直接使用 tensor.s…

frp实现内网穿透极简教程

frp实现内网穿透极简教程 本文是内网穿透极简教程,为求简洁,我们不介绍为什么内网穿透也不介绍其原理,这里假设各位读者都已经明确的知道自己的目的,本文仅介绍如何安装配置 frp 实现内网穿透。 简单来说,内网穿透就…

图像预处理之warpaffine与双线性插值及其高性能实现

图像预处理之warpaffine与双线性插值及其高性能实现 视频讲解:https://www.bilibili.com/video/BV1ZU4y1A7EG 代码Repo:https://github.com/shouxieai/tensorRT_Pro 本文为视频讲解的个人笔记。 warpaffine矩阵变换 对于坐标点的变换,我们通…

LeetCode-10 正则表达式匹配

LeetCode-10 正则表达式匹配 动态规划 10. 正则表达式匹配 dp数组含义:dp[i][j]dp[i][j]dp[i][j] 表示 s[0:i−1]s[0:i-1]s[0:i−1] 能否被 p[0:j−1]p[0:j-1]p[0:j−1] 成功匹配。 状态转移方程 : 如果 s[i−1]p[j−1]s[i-1]p[j-1]s[i−1]p[j−1] …

shell if判断和for循环常见写法

shell if判断和for循环常见写法 转自: Shell中for循环的几个常用写法 Shell中if 条件判断总结 if常见写法 一、if的基本语法: if [ command ];then符合该条件执行的语句 elif [ command ];then符合该条件执行的语句 else符合该条件执行的语句 fibash shell会按顺序…

关于pytorch使用多个dataloader并使用zip和cycle来进行循环时出现的显存泄漏的问题

关于pytorch使用多个dataloader并使用zip和cycle来进行循环时出现的显存泄漏的问题 如果我们想要在 Pytorch 中同时迭代两个 dataloader 来处理数据,会有两种情况:一是我们按照较短的 dataloader 来迭代,长的 dataloader 超过的部分就丢弃掉…

neovim及coc.nvim自动补全初探

neovim及coc.nvim自动补全初探 安装 # mac # 安装 brew install neovim # 查看neovim安装路径 brew list nvim# ubuntu apt install neovim习惯了打开 vi/vim 的方式,可以用个 alias 在 ~/.zshrc 中设置一下: alias vi"nvim"插件 vim-plug…