1、在Python中以相对路径或者绝对路径来导入文件或者模块的方法
今天在调试代码的时候,程序一直提示没有该模块,一直很纳闷,因为我导入文件一直是用绝对路径进行导入的。按道理来讲是不会出现模块找不到的情况的。
最后仔细分析了整个代码的目录结构,才发现了问题。
下面依次来说明一下今天的情况
先看导入的代码:
在demo――mnist.py文件中执行以下两种导入操作# 第一处from gcforest.gcforest import GCForestfrom gcforest.utils.config_utils import load_json# 第二处config = load_json("demo_mnist-ca.json") # 里面传入的是文件的位置,这个函数是读取配置文件的内容
然后看一下目录的结构
在此例中,demo_mnist,py为主文件。它第一处要导入的是它当前目录的父目录下的一个子目录中的一个目录中的文件。
所以以绝对路径导入这个文件就是 from lib.gcforest.gcforet import GCForest
以相对路径导入这个文件就是 from ..gcforest.gcforet import GCForest
第二处导入的是它统一个目录下的另一个文件,所以可以直接导入
所以修改的导入代码为:config = load_json("demo_mnist-ca.json")
2、 顺便复习一下相对路径和绝对路径的概念
绝对路径就是文件的真正存在的路径,是指从硬盘的根目录(盘符)开始,进行一级级目录指向文件。
相对路径就是以当前文件为基准进行一级级目录指向被引用的资源文件。
以下是常用的表示当前目录和当前目录的父级目录的标识符
../ 表示当前文件所在的目录的上一级目录
./ 表示当前文件所在的目录(可以省略)
/ 表示当前站点的根目录(域名映射的硬盘目录)
在Python中可以验证一下上述的标识方法:
测试的目录结构:
import ospath1=os.path.abspath('.') # 表示当前所处的文件夹的绝对路径print(path1)path2=os.path.abspath('..') # 表示当前所处的文件夹上一级文件夹的绝对路径print(path2)
# D:/PycharmProjects/mnistCheck/AbsolutepathAndrelativepath.pyD:/PycharmProjects/mnistCheckD:/PycharmProjects
3、 再了解一下Python sys.path的使用
sys.path是python的搜索模块的路径集,是一个list,如下:
['D://PycharmProjects//mnistCheck', 'D://PycharmProjects//mnistCheck', 'D://PycharmProjects//KerasDataSettry', 'C://ProgramData//Anaconda3//envs//tensorflow//python35.zip', 'C://ProgramData//Anaconda3//envs//tensorflow//DLLs', 'C://ProgramData//Anaconda3//envs//tensorflow//lib', 'C://ProgramData//Anaconda3//envs//tensorflow', 'C://ProgramData//Anaconda3//envs//tensorflow//lib//site-packages', 'C://ProgramData//Anaconda3//envs//tensorflow//lib//site-packages//Sphinx-1.6.3-py3.5.egg']
可以在python 环境下使用: .
sys.path.append(‘你的模块的名称')。sys.path.insert(0,'模块的名称')
添加相关的路径,但在退出python环境后自己添加的路径就会自动消失!
代码中的实现如下:
import syssys.path.append('C:/Users/Administrator/Desktop/ExperimentAss/gcForest-master')
4、最后了解一下 python 在不同层级目录import 模块的方法(重点)
有一个文件夹/home/a, 里面有个模块叫b.py, 我怎么把他import到程序里?
方法一: (属于刚开始分析的代码里第一种情况)
import sys; sys.path.append(“/home/a/”) import b
方法二:
在目录里面增加__init__.py文件,里面可以写import时执行的代码,当然也可以留空就可以.
import home.a.b
方法三:
from home.a.b import *
前提 home、a中都包括__init__.py 即:要导入的文件的当前目录和父目录都要有init.py文件
Python包含子目录中的模块方法比较简单,关键是能够在sys.path里面找到通向模块文件的路径。
下面将具体介绍几种常用情况:
(1)主程序与模块程序在同一目录下:
如下面程序结构: