Python关于导入模块的一些感想:
写项目的时候,碰到这种情况
程序业务为core,里面有两个目录,core1 和core2 core1中有三个模块,business main main1
程序入口为bin目录下的project模块
导入方式: main1 要使用main模块的main方法 from main import main
而main模块中的main方法又使用了business的b1方法 from business import b1
如果要在project模块中使用main1方法 下面这样写执行就会报错:ModuleNotFoundError: No module named 'main'
import os,sys
ATM_PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # C:\Users\Administrator\PycharmProjects\15group\level_3\exam_level3\project
sys.path.append(ATM_PATH)
from core.core1.main1 import main1
问题来了,,,,单个测试main1 main 都没有问题,而从project去调用main1就有问题了呢?????
...........一番忙活,自己建模块各种测试+网上查资料终于找到原因:
报错是因为模块搜索路径为C:\Users\Administrator\PycharmProjects\15group\level_3\exam_level3\project ,执行到main1的时候发现from main import main语句 按照project路径找不到main了所以报错。。
那么我可以在模块里面都按照这个路径来写:from core.core1.main1 import main1, from core.core1.main import main,from core.core1.business import b1
这样联合测试是没有问题了。可是单个测试又出现模块找不到的问题。那么有没有办法可以让联合测试和单个测试都能通过呢????请看下面
这里涉及到一个PYTHONPATH的东西,它是Python的模块搜索路径。可以通过sys.path查看:而且不同的目录执行PATHONPATH有所不同例如:
C:\Users\Administrator\PycharmProjects\15group\level_3\exam_level3\project\bin #执行路径
C:\Users\Administrator\PycharmProjects\15group
C:\Users\Administrator\AppData\Local\Programs\Python\Python36\python36.zip
C:\Users\Administrator\AppData\Local\Programs\Python\Python36\DLLs
C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib
C:\Users\Administrator\AppData\Local\Programs\Python\Python36
C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\site-packages
C:\Users\Administrator\PycharmProjects\15group\level_3\exam_level3\project\core\core1 # 执行路径
C:\Users\Administrator\PycharmProjects\15group
C:\Users\Administrator\AppData\Local\Programs\Python\Python36\python36.zip
C:\Users\Administrator\AppData\Local\Programs\Python\Python36\DLLs
C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib
C:\Users\Administrator\AppData\Local\Programs\Python\Python36
C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\site-packages
而且用sys.path.append()去添加PYTHONPATH只在当前程序运行过程生效
因此就会出现上述的错误。那么改进方法慢慢想一想可以找到,我是这样做的:在core1下建一个__init__文件,因为执行project的时候会import到core1文件,就会执行__init__文件
__init__中的代码:
import sys,os
ATM_PATH = os.path.dirname(os.path.abspath(__file__))
#C:\Users\Administrator\PycharmProjects\15group\level_3\exam_level3\project\core\core1
sys.path.append(ATM_PATH)
这样达到的效果就是联合测试 和 单个测试都可以通过
再看看怎样添加PYTHONPATH路径:
(转)为Python添加默认模块搜索路径
原文出处:https://www.douban.com/note/334738164/
方法一:函数添加
1 import sys
2 查看sys.path
3 添加sys.path.append("c:\\")
方法二:修改环境变量。 ????网上搜的跟第一种一样
w用户可以修改系统环境变量PYTHONPATH
方法三:增加.pth文件,推荐!
在site-packages添加一个路径文件,如mypkpath.pth,必须以.pth为后缀,写上你要加入的模块文件所在的目录名称就是了。
1 windows
c:\python27\site-packages
# 我们的学员把pth文件直接放在c:\python27
# (或其他python安装目录)目录下测试也是有效的
# 2015.9.23
2 linux(ubuntu)
/usr/local/lib/python2.7/dist-packages (note by shanql, 我是放在这个目录下有效的,所添加的目录一定要存在,不存在则会不成功)
2 linux(redhat)
/usr/lib/python2.7/site-packages
以下是另一篇文章:http://blog.sina.com.cn/s/blog_59ba44680100z0mt.html
学习python不久,碰到个问题,怎么样把自己写的模块加入到python默认就有的搜索路径中呢?不要每次非得import sys; sys.path.append(‘/home/fightlikekobe/python’)才可。
上网找了很多久未果,都来我自己糊里糊涂找到了解决方法,那就是在dist-packages(即/usr/local/lib/python2.7/dist-packages)添加一个路径文件,如mypkpath.pth,必须以.pth为后缀,写上你要加入的文件名称就是了,如我的:
/home/fightlikekobe/python
保存退出,OK!结果自己验证,重启terminal,再次打开python,
>>> import sys
>>> sys.path
['/home/fightlikekobe', '/usr/bin', '/usr/local/lib/python2.7/dist-packages/pymysql_sa-1.0-py2.7.egg', '/usr/local/lib/python2.7/dist-packages/PyMySQL-0.5-py2.7.egg', '/usr/local/lib/python2.7/dist-packages/hiredis-0.1.0-py2.7-linux-i686.egg', '/usr/local/lib/python2.7/dist-packages/SQLAlchemy-0.7.3-py2.7-linux-i686.egg', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/local/lib/python2.7/dist-packages', '/home/fightlikekobe/python', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PIL', '/usr/lib/python2.7/dist-packages/gst-0.10', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7', '/usr/lib/python2.7/dist-packages/ubuntu-sso-client', '/usr/lib/python2.7/dist-packages/ubuntuone-client', '/usr/lib/python2.7/dist-packages/ubuntuone-control-panel', '/usr/lib/python2.7/dist-packages/ubuntuone-couch', '/usr/lib/python2.7/dist-packages/ubuntuone-installer', '/usr/lib/python2.7/dist-packages/ubuntuone-storage-protocol', '/usr/lib/python2.7/dist-packages/wx-2.8-gtk2-unicode']
Python关于导入模块的一些感想:的更多相关文章
- python有三种导入模块的方法(转)
原文:http://www.cnblogs.com/allenblogs/archive/2011/11/15/2055149.html python有三种导入模块的方法 其一, import mod ...
- python中导入模块的本质, 无法导入手写模块的解决办法
最近身边一些朋友发生在项目当中编写自己模块,导入的时候无法导入的问题. 下面我来分享一下关于python中导入模块的一些基本知识. 1 导入模块时寻找路径 在每一个运行的python程序当中,都维护了 ...
- Python 动态导入模块
动态导入模块 目录结构: zhangsandeMacBook-Air:1110 zhangsan$ tree . . ├── lib │ └── aa.py ├── test1.py lib目录下 ...
- python动态导入模块——importlib
当在写代码时,我们希望能够根据传入的选项设置,如args.model来确定要导入使用的是哪个model.py文件,而不是一股脑地导入 这种时候就需要用上python的动态导入模块 比如此时文件结构为: ...
- python基础--导入模块
一,import的使用1, 模块就是一组功能的集合体,我们的程序可以导入模块来复用模块中的功能一个模块就是包含了一组功能的python文件,例如demo.py 可以通过import来使用这个文件定义d ...
- python中导入模块的注意点
1.import 和 from import 的区别 import module导入模块:语句执行完后会创建一个新的命名空间,在该命名空间中执行相应的函数.执行时,需要的变量.函数和类名前需要加 ...
- python控制流-导入模块
一.模块 1.含义 Python 程序可以调用一组基本的函数,这称为“内建函数”,包括你见到过的 print().input()和 len()函数.Python 也包括一组模块,称为“标准库”.每个模 ...
- python改变导入模块中的变量的问题
Python中循环函数1调用函数2,函数2中import了一个模块,函数1: def run(): for a in b: runTest(a,patter) 函数2: def runTest(cas ...
- Python函数-导入模块的顺序及原理
引入 当python导入模块,执行import语句时,到底进行了什么操作?按照python的文档,她执行了如下的操作: 第一步,创建一个新的module对象(它可能包含多个module) 第二步,把这 ...
随机推荐
- python 之filter()函数
filter()函数是 Python 内置的另一个有用的高阶函数,filter()函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,filt ...
- CodeForces 515C Drazil and Factorial (水题)
题意:给出含有 n 个只有阿拉伯数字的字符串a,设定函数F(a) = 每个数字的阶乘乘积 .需要找出 x,使得F(x) = F(a),且组成 x 的数字中没有0和1.求最大的 x 为多少. 析:最大, ...
- Java 中extends与implements使用方法 (转载)
转自:http://blog.csdn.net/chen_chun_guang/article/details/6323201 初学Java语言, 代码中的extends和implements让我感到 ...
- vue-cli 升级至 webpack 4 指北
时至今日(2018-7-11),vue-cli 任然未稳定支持至webpack4,所以我自己也来创建一个 vue 初始化模板 不过大致的原因我也能猜到,因为很多插件仍然是一个不稳定的点,比如我在创建中 ...
- SQL常用指令集(Oracle)
1. Select rownum(oracle) top(mysql): 用于规定返回指定数目的值 Where roenum < number 2. Like 用于在where子句搜索指定模式 ...
- 【原创】Eclipse实现图形化界面插件-vs4e
vs4e插件下载地址:http://visualswing4eclipse.googlecode.com/files/vs4e_0.9.12.I20090527-2200.zip 下载完成后,解压,然 ...
- 怎样去思考问题 解决问题 zkc学长的福利
题目描述 又是一年ACM集训的时刻,zkc学长邀请n位同学来玩一个有奖游戏.首先,他让每个同学在左.右手上面分别写下一个整数,zkc学长自己也在左.右手上各写一个整数.然后,让这n位同学排成一排,zk ...
- $割点割顶tarjan$
原题 #include <bits/stdc++.h> using namespace std; typedef long long LL; inline LL read () { LL ...
- UML中类之间的关系
UML中类之间的关系分为以下几种:依赖.关联.泛化.聚合.组合. 依赖是指一个类使用了另一个类,它是一种使用关系,描述了一个事物的规格说明的变化可能会影响到使用它的另一个事物(反之不一定).最常见的依 ...
- 371 Sum of Two Integers 两整数之和
不使用运算符 + 和-,计算两整数a .b之和.示例:若 a = 1 ,b = 2,返回 3. 详见:https://leetcode.com/problems/sum-of-two-integers ...