zoukankan      html  css  js  c++  java
  • python模块包调用问题

    1.不同目录下函数调用

    A

       |----- __init__.py

       |-----  a.py

       |---------B

             |--------- __init__.py

             |---------b.py

       |---------C

             |--------- __init__.py

             |--------c.py

    如图所示结构树,B,C同属于A的子目录,但是B,C之间是平行的。。。

    b.py,c.py代码分别如下:

    b.py:

    def b_hello():
        print "B_HELLO"

    c.py:

    def c_hello():
        print "C_HELLO"

    如果A中a.py要调用B中或者C中py,则可以如下方式调用(以B为例)

    from B import b

    b.b_hello()

    运行结果:B_HELLO

    但是如果是B中或者C中py调用B中或C中呢?

    这个时候如果我们依旧用如上所说调用,则会报错(这里是b.py调用c.py)

    >>>

    Traceback (most recent call last):
      File "E: estnowAB.py", line 1, in <module>
        from C import c
    ImportError: No module named C

    所以,这种方法不行,那如何做呢,如下

    import sys
    sys.path.append('E:\testnow\A\C')
    import c
    def b_hello():
        print "B_HELLO"
    c.c_hello()

    用这种方法,输出结果是:C_HELLO

    也即刚才上面的“from 文件夹 import 模块名”只适用于父目录调用子目录的情况。。。而第二种方法则对所有的情况都适用,包括两个模块甚至都不在一个盘的情况。。。这里需要注意的一点是:sys.path添加目录时注意是在windows还是在linux下,windows下需要‘\’否则会出错。。。。。。。(我在这点上走了很久的弯路。。。)

    2.同目录下函数调用

    包是一个分层次的文件目录结构,它定义了一个由模块及子包,和子包下的子包等组成的 Python 的应用环境。

    简单来说,包就是文件夹,但该文件夹下必须存在 __init__.py 文件, 该文件的内容可以为空。__init__.py 用于标识当前文件夹是一个包。

    考虑一个在 package_runoob 目录下的 runoob1.py、runoob2.py、__init__.py 文件,test.py 为测试调用包的代码,目录结构如下:

    test.py
    package_runoob
    |-- __init__.py
    |-- runoob1.py
    |-- runoob2.py

    源代码如下:

    package_runoob/runoob1.py

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
     
    def runoob1():
       print "I'm in runoob1"

    package_runoob/runoob2.py

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
     
    def runoob2():
       print "I'm in runoob2"

    现在,在 package_runoob 目录下创建 __init__.py

    package_runoob/__init__.py

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
     
    if __name__ == '__main__':
        print '作为主程序运行'
    else:
        print 'package_runoob 初始化'

    然后我们在 package_runoob 同级目录下创建 test.py 来调用 package_runoob 包

    test.py

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
     
    # 导入 Phone 包
    from package_runoob.runoob1 import runoob1
    from package_runoob.runoob2 import runoob2
     
    runoob1()
    runoob2()

    以上实例输出结果:

    package_runoob 初始化
    I'm in runoob1
    I'm in runoob2

  • 相关阅读:
    C语言读写伯克利DB 4
    程序之美(转自知乎)
    C语言读写伯克利DB 3
    ON DUPLICATE KEY UPDATE
    nanomsg:ZeroMQ作者用C语言新写的消息队列库
    新浪研发中心: Berkeley DB 使用经验总结
    [企业开源系列]后起之秀Facebook凭什么挑战互联网霸主Google?
    BZOJ1770:[USACO]lights 燈(高斯消元,DFS)
    BZOJ5293:[BJOI2018]求和(LCA,差分)
    BZOJ5301:[CQOI2018]异或序列(莫队)
  • 原文地址:https://www.cnblogs.com/abc8023/p/14747318.html
Copyright © 2011-2022 走看看