• Python(模块&包)


    参考:https://www.cnblogs.com/yuanchenqi/articles/5732581.html

    在linux下给pycharm安装第三方库,需要在.bashrc中加:

    因为对应版本的pip在其中。

    模块

    cal.py

    1 def add(x,y):
    2     return x+y
    3 
    4 def sub(x,y):
    5     return x-y
    6 
    7 print('ok')
    8 x = 3

    bin.py

     1 import sys
     2 
     3 import cal#飘红是因为ide没找到,并不是不存在, 
     4 # 找到cal.py后 ,cal.py中的内容也执行
     5 
     6 print(cal.add(3, 5))
     7 
     8 print(sys.path)#模块搜索路径
     9 
    10 #print(x) NameError: name 'x' is not defined
    11 print(cal.x)

    当import cal时,其中所有内容都会被执行,print(打印了) ok。

    执行结果:

    ok
    8
    ['/home/nizhipeng/PycharmProjects/learnPython/week5/模块项目', '/home/nizhipeng/PycharmProjects/learnPython', '/usr/lib/python35.zip', '/usr/lib/python3.5', '/usr/lib/python3.5/plat-x86_64-linux-gnu', '/usr/lib/python3.5/lib-dynload', '/home/nizhipeng/PycharmProjects/learnPython/venv/lib/python3.5/site-packages', '/home/nizhipeng/PycharmProjects/learnPython/venv/lib/python3.5/site-packages/setuptools-39.1.0-py3.5.egg', '/home/nizhipeng/PycharmProjects/learnPython/venv/lib/python3.5/site-packages/pip-10.0.1-py3.5.egg']
    3
    
    Process finished with exit code 0

    #####################################################################

    只修改bin.py

    1 from cal import add,sub #从模块里调用方法
    2 print(add(3, 7))
    3 print(sub(3, 6))
    4 
    5 #print(x) #NameError: name 'x' is not defined  并没有被加载
    6 #print(cal.x) #NameError: name 'cal' 

    只加载了add,sub。cal本身都没有被加载,所以第6行会显示错误,x也是同样。

    执行结果:

    ok
    10
    -3
    
    Process finished with exit code 0

    ###########################################################################3

    只修改bin.py

    1 from cal import *
    2 #如果和cal中有重复的函数
    3 def add(x,y):
    4     return x+y+5
    5 
    6 print(add(3, 7))  #add执行的是当前的add,而不是cal.py中的add,由执行顺序决定
    add执行的是当前的add,而不是cal.py中的add,由执行顺序决定
    执行结果:
    ok
    15
    
    Process finished with exit code 0

    from cal import add as plus,可自定义名字。

    为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package)。

    模块是用来组织函数的,包是用来组织模块的。

    包中有__init__.py文件。

    调用包中的包的函数web包中还有包web2。

    bin.py

    from web.web2 import logger
    logger.logger()

    logger.py

    #通过bin调用web中的方法
    
    def logger():
        print('logger')

    执行结果:

    logger
    
    Process finished with exit code 0

     ############################################################################

    如果import某一个包,将会执行该包中__init__.py文件。

    如果import某一个模块,将会执行模块中程序。

    ####################################################################################################################################

    运行bin.py程序时有如下报错:

    找不到模块logger,原因是bin.py中from module import main,相当于将main模块的程序全部写入了bin.py,于是bin.py中有了import logger,但是logger模块并不在bin.py的同级文件夹下,所以并不能找到logger模块(ImportError: No module named 'logger')。

    其中logger.py

    def logging():
        print('loggering')

    main.py,bin.py已写出,其他程序为空(bin,module,conf为包,其中有__init__.py)。

    只要在main.py文件中将import logger改为from module import logger,就可以正常运行。但是bin.py文件也不是和module包为同级文件,为什么可以运行能?

    可在bin.py用sys.path查看,包的寻找路径,发现为:

    ['/home/nizhipeng/PycharmProjects/ATM/bin', '/home/nizhipeng/PycharmProjects/ATM', '/usr/lib/python35.zip', '/usr/lib/python3.5', '/usr/lib/python3.5/plat-x86_64-linux-gnu', '/usr/lib/python3.5/lib-dynload', '/home/nizhipeng/PycharmProjects/ATM/venv/lib/python3.5/site-packages', '/home/nizhipeng/PycharmProjects/ATM/venv/lib/python3.5/site-packages/setuptools-39.1.0-py3.5.egg', '/home/nizhipeng/PycharmProjects/ATM/venv/lib/python3.5/site-packages/pip-10.0.1-py3.5.egg']

    '/home/nizhipeng/PycharmProjects/ATM',所以可以找到module包。

     用命令行可以证明,发现在终端下不能运行,说明有关路径是pycharm加上的,实际上在main.py文件中将import logger改为from module import logger这种方法使程序能够运行是错误的,必须在所有环境中都能运行。

    其中第7行在IDE和终端中的执行结果不同,终端输出的是相对路径,而IDE输出的是绝对路径。

    其中第11行将上一级路径加到执行环境中,这样程序在终端和IDE下都能正常运行(虽然程序在不同电脑上路径都不一样,但都是bin.py文件的上一级路径)。

    #########################################################################

    if __name == '__main__':

    foo.py

    1 def hello():
    2     print('hello')
    3 
    4 if __name__ == '__main__':
    5     hello()

    4,5行为测试代码,执行结果:

    hello
    
    Process finished with exit code 0

    如果foo.py作为模块被调用,测试代码不会被执行。

    bin.py

     1 import foo 2 foo.hello() 

    执行结果:

    hello
    
    Process finished with exit code 0

    bin.py执行结果,__name__为__main__。

    若foo.py作为模块被调用时,其中的__name__为foo,即模块名。

  • 相关阅读:
    linux shell在while中用read从键盘输入
    ubuntu14.04折腾迅雷xware
    select与epoll分析
    ubuntu 14.04下练习lua
    C++中的重载、覆盖、隐藏
    删除ubuntu旧内核
    fcntl函数加文件锁
    系统中断与SA_RESTART
    linux使用共享内存通信的进程同步退出问题
    leetcode-easy-others-268 Missing Number
  • 原文地址:https://www.cnblogs.com/112358nizhipeng/p/9662619.html
Copyright © 2020-2023  润新知