關于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.pswp.cn/news/532493.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532493.shtml
英文地址,請注明出處:http://en.pswp.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…