python import 与 __import__ 学习笔记

原创
2018/11/06 17:38
阅读数 391

python 多文件编程文件调用方式

首先要知道的是在使用python命令执行python代码时,默认的代码执行方式是脚本的方式.如下:

$ python main.py
Hello World!

需要了解的是,除了通过脚本的方式运行python代码之外,python代码的执行方式还有另外一种方式:

python -m main
Hello World!

与看做脚本执行的方式不同,加了-m 参数后python会将后面的参数main当做一个模块来执行.当然,执行结果和不加-m参数时的执行结果没什么不同.但通过比较两者的命令参数时会很明显的发现在不加-m参数时python执行的是一个文件main.py,而在添加了 -m 参数以后python执行的是一个模块main,并非只是去掉后缀这么简单,而是参数的类型发生了根本性的改变.

从一方面来看 通过 python -m 以模块的去调用python不过是多此一举;但是不同于以脚本方式的运行方式,python -m在以模块方式运行的时候会将当前路径添加到系统参数sys.path中.这样当代码中存在导入包中的模块时不仅会去python的系统模块库和扩展模块库中查找模块,还会去当前路径及其子路径(不会去查找父路径)中查找合法的包中是否有对应模块存在并且导入.

main.py

import sys
print(sys.path)

当以不同方式去运行时

(python3.6) D:\spyder-workspace\import-test>python main.py
['D:\\spyder-workspace\\import-test', 'D:\\ProgramData\\Anaconda3\\envs\\python3.6\\python36.zip', 'D:\\ProgramData\\Anaconda3\\envs\\python3.6\\DLLs', 
'D:\\ProgramData\\Anaconda3\\envs\\python3.6\\lib', 'D:\\ProgramData\\Anaconda3\\envs\\python3.6', 'D:\\ProgramData\\Anaconda3\\envs\\python3.6\\lib\\site-packages']

(python3.6) D:\spyder-workspace\import-test>python -m main.py
['',
'D:\\ProgramData\\Anaconda3\\envs\\python3.6\\python36.zip', 'D:\\ProgramData\\Anaconda3\\envs\\python3.6\\DLLs', 'D:\\ProgramData\\Anaconda3\\envs\\python3.6\\lib',
'D:\\ProgramData\\Anaconda3\\envs\\python3.6', 'D:\\ProgramData\\Anaconda3\\envs\\python3.6\\lib\\site-packages']
D:\ProgramData\Anaconda3\envs\python3.6\python.exe: Error while finding module specification for 'main.py' (AttributeError: module 'main' has no attribute '__path__')

(python3.6) D:\spyder-workspace\import-test>python -m main
['',
'D:\\ProgramData\\Anaconda3\\envs\\python3.6\\python36.zip', 'D:\\ProgramData\\Anaconda3\\envs\\python3.6\\DLLs', 'D:\\ProgramData\\Anaconda3\\envs\\python3.6\\lib',
'D:\\ProgramData\\Anaconda3\\envs\\python3.6', 'D:\\ProgramData\\Anaconda3\\envs\\python3.6\\lib\\site-packages']
注意:这里当以 pyhton -m main.py 的方式运行时,脚本看似是正常运行了,但是到脚本的最后却报了一个错误,可以想的到的是在以模块方式执行时 python 首先会解析该模块并运行模块中的代码,然后尝试将这个模块加入到运行的模块表中,而模块名是 main.py 时,python 会认为 main 是包名 py 是模块名称,而去尝试查找main模块中应该包含的魔术变量__path__,但是当前的main模块并没有应该是包才拥有的__path__变量,因此会报(module 'main' has no attribute '__path__')

可以看到当以 python -m方式运行时会在sys.path中多出一个空字符串

在使用 python 进行多文件编程时, 有很多方式在当前代码中调用其他文件中的代码,其中包括:

方法1

文件结构:

project
   |----mods
   |     |----__init__.py
   |     |----mod1.py
   |----main.py
   |----__init__.py
---

入口代码:

from sys import path


__import__()是一个python内置的函数,用于动态加载模块中的类和函数.

import 语句导入;python 会将每个文件看成一个模块

关于 python import 动态加载性能的问题可以参考这篇博文:

python 动态加载是否影响性能?

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部