1 模块的函数调用
a: 模块名称
模块名.函数名
b:来自模块名称函数名称(作为别名)
调用另一个 .py 文件中的类和函数
在同一文件夹中调用
1. 通话功能
A.py文件如下:
def 添加(x,y):
print('总和为:%d'%(x+y))
在B.py文件中调用A.py的add函数如下:
A
A.添加(1,2)
或者
从 A 添加
加(1,2)
2. 调用类
A.py文件如下:
class A:
def __init__(self,xx,yy):
self.x=xx
self.y=yy
def add(self):
print("x和y的和为:%d"%(self.x+self.y))
在B.py文件中调用A.py的add函数如下:
from A import A
a=A(2,3)
a.add()
或
import A
a=A.A(2,3)
a.add()
在不同文件夹中调用
A.py文件的文件路径为:C:\\Test1
在B.py中调用A.py文件:
import sys
sys.path.append(r'C:\AmyPython\Test1')
#python import模块时, 是在sys.path里按顺序查找的。sys.path是一个列表,里面以字符串的形式存储了许多路径。使用A.py文件中的函数需要先将他的文件路径放到sys.path中
import A
a=A.A(2,3)
a.add()
1.如何使用相对路径或绝对路径导入文件或模块
今天调试代码的时候,程序一直提示没有这个模块。 我很疑惑,因为我导入的文件都是用绝对路径导入的。 按理来说,不会出现找不到模块的情况。
最后我仔细分析了整个代码的目录结构,发现了问题所在。
我们依次解释一下今天的情况:
我们先看一下导入的代码:
在demo——mnist.py文件中执行以下两种导入操作
# 第一处
from gcforest.gcforest import GCForest
from gcforest.utils.config_utils import load_json
# 第二处
config = load_json("demo_mnist-ca.json") # 里面传入的是文件的位置,这个函数是读取配置文件的内容
然后看一下目录结构
在此示例中,,py 是主文件。 它导入的第一件事是当前目录的父目录的子目录中的目录中的文件。
所以用绝对路径导入这个文件是从lib..
使用相对路径导入此文件来自...
第二次导入的是同目录下的另一个文件,所以可以直接导入。
所以修改后的导入代码为:=("-ca.json")
2.我们回顾一下相对路径和绝对路径的概念。
绝对路径是文件的实际路径,是指从硬盘根目录(盘符)开始,一层层指向文件。
相对路径是指以当前文件为基础,指向所引用的资源文件的一级目录。
下面是常用的表示当前目录和当前目录的父目录的标识符。
../表示当前文件所在目录的上一级目录。
./表示当前文件所在目录(可省略)
/代表当前站点根目录(域名映射的硬盘目录)
您可以在以下位置验证上述识别方法:
测试目录结构:
import os
path1=os.path.abspath('.') # 表示当前所处的文件夹的绝对路径
print(path1)
path2=os.path.abspath('..') # 表示当前所处的文件夹上一级文件夹的绝对路径
print(path2)
# D:/PycharmProjects/mnistCheck/AbsolutepathAndrelativepath.py
D:\PycharmProjects\mnistCheck
D:\PycharmProjects
3.详细了解sys.path的使用
sys.path是搜索模块的路径集,是一个列表,如下:
[
'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'
]
可使用环境: .
sys.path.('模块的名称')。
sys.path.(0,'模块名称')
添加相关路径,但是退出环境后你添加的路径会自动消失!
代码中的实现如下:
import sys
sys.path.append('C:\Users\Administrator\Desktop\ExperimentAss\gcForest-master')
4、最后了解一下不同级别目录模块的方法(重点)
有一个文件夹/home/a,里面有一个名为b.py的模块。 如何将其添加到程序中?
方法一:(属于我刚开始分析的代码中的第一种情况)
系统;
sys.path.(“/home/a/”)
乙
方法二:
在目录中添加一个.py文件,可以在其中编写执行时会执行的代码。 当然,您也可以将其留空。
主页.ab
方法三:
来自 home.ab *
前提是home和a都包含.py。 即当前目录和待导入文件的父目录都必须有init.py文件。
将模块包含在子目录中的方法比较简单。 关键是能够在sys.path中找到模块文件的路径。
下面将详细介绍几种常见情况:
(1)主程序和模块程序在同一目录下:
程序结构如下:
– 源代码
|– mod1.py
|– 测试1.py
如果程序test1.py中导入了模块mod1,则直接使用mod1或从mod1 *;
(2) 主程序所在目录是模块所在目录的父(或祖先)目录。
程序结构如下:
– 源代码
|– mod1.py
|– mod2
| – mod2.py
– 测试1.py
如果在程序test1.py中导入模块mod2,则需要在mod2文件夹下创建一个空的.py文件(也可以在该文件中自定义输出模块接口); 然后使用 mod2.mod2 * 或 mod2.mod2。
(3)主程序导入上层目录的模块或其他目录的模块(横向)
程序结构如下:
– 源代码
|– mod1.py
|– mod2
|– mod2.py
|– 子
| – 测试2.py
– 测试1.py
如果将模块mod1.py和mod2.py导入到程序test2.py中。 首先,需要在mod2下创建一个.py文件(同(2))。 不需要在src下创建这个文件。 然后调用如下:
下面的程序执行方式都是在程序文件所在目录下执行。 例如cd sub后执行test2.py;
Test1.py 在 cd src;; 之后执行不保证 sub/test2.py 在 src 目录中成功执行。
系统
系统路径.("..")
模1
mod2.mod2
(4) 从(3)可以看出,导入模块的关键是能够根据sys.path环境变量的值找到具体模块的路径。 这里我们只介绍以上三种简单的情况。
总结:
从总结中我们可以发现,当要导入的文件与当前文件在同一目录下时,直接导入文件名即可。
当你要导入的文件或目录与你当前文件不在同一个目录时,需要跳转到你要导入的文件的父目录,然后用点号连接你已经过关的目录或文件按级别,然后就是这样。 至于如何跳转到这个父目录。 更常见的方法是将父目录添加到系统路径中,然后用点逐级搜索,直到到达要导入的模块。