写项目的时候,碰到这种情况

程序业务为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关于导入模块的一些感想:的更多相关文章

  1. python有三种导入模块的方法(转)

    原文:http://www.cnblogs.com/allenblogs/archive/2011/11/15/2055149.html python有三种导入模块的方法 其一, import mod ...

  2. python中导入模块的本质, 无法导入手写模块的解决办法

    最近身边一些朋友发生在项目当中编写自己模块,导入的时候无法导入的问题. 下面我来分享一下关于python中导入模块的一些基本知识. 1 导入模块时寻找路径 在每一个运行的python程序当中,都维护了 ...

  3. Python 动态导入模块

    动态导入模块 目录结构: zhangsandeMacBook-Air:1110 zhangsan$ tree . . ├── lib │   └── aa.py ├── test1.py lib目录下 ...

  4. python动态导入模块——importlib

    当在写代码时,我们希望能够根据传入的选项设置,如args.model来确定要导入使用的是哪个model.py文件,而不是一股脑地导入 这种时候就需要用上python的动态导入模块 比如此时文件结构为: ...

  5. python基础--导入模块

    一,import的使用1, 模块就是一组功能的集合体,我们的程序可以导入模块来复用模块中的功能一个模块就是包含了一组功能的python文件,例如demo.py 可以通过import来使用这个文件定义d ...

  6. python中导入模块的注意点

    1.import  和 from  import 的区别 import module导入模块:语句执行完后会创建一个新的命名空间,在该命名空间中执行相应的函数.执行时,需要的变量.函数和类名前需要加  ...

  7. python控制流-导入模块

    一.模块 1.含义 Python 程序可以调用一组基本的函数,这称为“内建函数”,包括你见到过的 print().input()和 len()函数.Python 也包括一组模块,称为“标准库”.每个模 ...

  8. python改变导入模块中的变量的问题

    Python中循环函数1调用函数2,函数2中import了一个模块,函数1: def run(): for a in b: runTest(a,patter) 函数2: def runTest(cas ...

  9. Python函数-导入模块的顺序及原理

    引入 当python导入模块,执行import语句时,到底进行了什么操作?按照python的文档,她执行了如下的操作: 第一步,创建一个新的module对象(它可能包含多个module) 第二步,把这 ...

随机推荐

  1. YTU 2697: 血型统计

    2697: 血型统计 时间限制: 1 Sec  内存限制: 128 MB 提交: 405  解决: 164 题目描述 黑猫警长在犯罪现场发现了一些血迹,现已经委托检验机构确定了血型,需要统计各种血型的 ...

  2. openstack cluster 封装

  3. MySql 5.7 Archive 版本安装失败 解决过程

    下载地址 https://dev.mysql.com/downloads/mysql/5.7.html#downloads 按照网络教程: 创建my.ini 文件,并填写配置内容: [mysql] # ...

  4. bzoj 1827: [Usaco2010 Mar]gather 奶牛大集会【树形dp】

    不能用read会TLE!!不能用read会TLE!!不能用read会TLE!! 一开始以为要维护每个点,线段树写了好长(还T了-- 首先dfs一遍,求出点1为集会地点的答案,处理处val[u]为以1为 ...

  5. 在Chrome与火狐中,输入框input类型为number时,如何去除掉的自带的上下默认箭头

    如何移除input='number'时浏览器自带的上下箭头: CSS样式: /* 去除input[type=number]浏览器默认的icon显示 */ input::-webkit-outer-sp ...

  6. php insteadof 作用

    PHP5的另一个新成员是instdnceof关键字.使用这个关键字可以确定一个对象是类的实例.类的子类,还是实现了某个特定接口,并进行相应的操作.在某些情况下,我们希望确定某个类是否特定的类型,或者是 ...

  7. 【LeetCode】LeetCode Weekly Contest 16B

    2.一个游戏 YouTube MIT 算法课上有详细的讲解 思路是DP. 话说MIT OpenCourseWare 真心不错.应该好好看看,讲的详细生动. Tips: 1.当n是偶数的时候,首先的选择 ...

  8. 10步成为专业iOS开发者——新手向,从零起步

    想在移动开发大餐中分一杯羹,体验最火最炫的技术?小伙子,很有眼光嘛 毫无疑问,移动开发在目前和未来几年内都会盛极一时.无数开发职位虚位以待.各大公司都在寻找各种层次的程序员——新手级.入门级.中级.老 ...

  9. 什么是2MSL以及TIME_WAIT的作用

    TIME_WAIT主要是用来解决以下几个问题: 1)上面解释为什么主动关闭方需要进入TIME_WAIT状态中提到的: 主动关闭方需要进入TIME_WAIT以便能够重发丢掉的被动关闭方FIN包的ACK. ...

  10. elasticsearch 查询优化

    首先对不必要的字段不做分词也就是不做索引,禁止内存交换 1.shard 一个Shard就是一个Lucene实例,是一个完整的搜索引擎. 分片数过多会导致检索时打开比较多的文件,多台服务器之间通讯成本加 ...