精华内容
下载资源
问答
  • 在Python工程里,当python检测到一个目录下存在__init__.py文件时,python就会把它当成一个模块(module)。Module跟C++的命名空间和Java的Package的概念很像,都是为了科学地组织化工程,管理命名空间。 __init__....

    在Python工程里,当python检测到一个目录下存在__init__.py文件时,python就会把它当成一个模块(module)。Module跟C++的命名空间和Java的Package的概念很像,都是为了科学地组织化工程,管理命名空间。

    __init__.py的设计原则
    __init__.py的原始使命是声明一个模块,所以它可以是一个空文件。在__init__.py中声明的所有类型和变量,就是其代表的模块的类型和变量。我们在利用__init__.py时,应该遵循如下几个原则:
    A、不要污染现有的命名空间。模块一个目的,是为了避免命名冲突,如果你在种用__init__.py时违背这个原则,是反其道而为之,就没有必要使用模块了。
    B、利用__init__.py对外提供类型、变量和接口,对用户隐藏各个子模块的实现。一个模块的实现可能非常复杂,你需要用很多个文件,甚至很多子模块来实现,但用户可能只需要知道一个类型和接口。由于各个子模块的实现有可能非常复杂,而对外提供的类型和接口有可能非常的简单,我们就可以通过这个方式来对用户隐藏实现,同时提供非常方便的使用。
    C、只在__init__.py中导入有必要的内容,不要做没必要的运算。一句话,__init__.py只是为了达到B中所表述的目的,其它事情就不要做啦。

    scrapy的__init__.py

    import pkgutil
    import sys
    import warnings
    from twisted import version as _txv
    # Declare top-level shortcuts
    from scrapy.spiders import Spider
    from scrapy.http import Request, FormRequest
    from scrapy.selector import Selector
    from scrapy.item import Item, Field
    __all__ = [
        '__version__', 'version_info', 'twisted_version', 'Spider',
        'Request', 'FormRequest', 'Selector', 'Item', 'Field',
    ]
    # Scrapy and Twisted versions
    __version__ = (pkgutil.get_data(__package__, "VERSION") or b"").decode("ascii").strip()
    version_info = tuple(int(v) if v.isdigit() else v for v in __version__.split('.'))
    twisted_version = (_txv.major, _txv.minor, _txv.micro)
    # Check minimum required Python version
    if sys.version_info < (3, 6):
        print("Scrapy %s requires Python 3.6+" % __version__)
        sys.exit(1)
    # Ignore noisy twisted deprecation warnings
    warnings.filterwarnings('ignore', category=DeprecationWarning, module='twisted')
    del pkgutil
    del sys
    del warnings
    

    scrapy的__main__.py从scrapy.cmdline中导入execute函数,并执行

    from scrapy.cmdline import execute
    if __name__ == '__main__':
        execute()
    
    展开全文
  • Package内的__main__.py和__init__.py

    千次阅读 2018-08-11 00:03:52
    1 概念 ...(1) 如果你希望 python 将一个文件夹作为 Package 对待,那么这个文件夹中必须包含一个名为 __init__.py 的文件,即使它是空的。 (2) 如果你需要 python 将一个文件夹作为 Package 执行...

     

    1 概念

    假设一个最简单的Package如下:

    
    ├──pkg
    │   ├── __init__.py
    │   ├── __main__.py

     

     

    (1) 如果你希望 python 将一个文件夹作为 Package 对待,那么这个文件夹中必须包含一个名为 __init__.py 的文件,即使它是空的。

    (2) 如果你需要 python 将一个文件夹作为 Package 执行,那么这个文件夹中必须包含一个名为 __main__.py 的文件。


    在实际中,可以将pkg作为一个文件夹执行:
    python pkg

    也可以将pkg作为一个Package执行:
    python -m pkg

     

     

    2. 那么,这两者有什么区别呢?为此,我们做一个简单的实验。


    (1) 案例1

    在__init__.py写入如下内容:

     

     

    #!/usr/bin/env python
    import sys
     
    print('__init__')
    print('__init__.__name__', __name__)
    print('__init__.__package__', __package__)

     

     

    在__main__.py写入如下内容:

     

    #!/usr/bin/env python
    import sys
     
    print('__main__')
    print('__main__.__name__', __name__)
    print('__main__.__package__', __package__)
     
    print('sys.path', sys.path)

     

     

    执行 python pkg 和 python -m pkg,对比一下它们的输出结果:

     

    [root@localhost test_08_10]# python pkg
    __main__
    ('__main__.__name__', '__main__')
    ('__main__.__package__', '')
    ('sys.path', ['pkg', '/usr/lib64/python27.zip', '/usr/lib64/python2.7', '/usr/lib64/python2.7/plat-linux2',
     '/usr/lib64/python2.7/lib-tk', '/usr/lib64/python2.7/lib-old', '/usr/lib64/python2.7/lib-dynload', 
     '/usr/lib64/python2.7/site-packages', '/usr/lib/python2.7/site-packages'])
    [root@localhost test_08_10]# 
    [root@localhost test_08_10]# 
    [root@localhost test_08_10]# 
    [root@localhost test_08_10]# 
    [root@localhost test_08_10]# python -m pkg
    __init__
    ('__init__.__name__', 'pkg')
    ('__init__.__package__', 'pkg')
    __main__
    ('__main__.__name__', '__main__')
    ('__main__.__package__', 'pkg')
    ('sys.path', ['', '/usr/lib64/python27.zip', '/usr/lib64/python2.7', '/usr/lib64/python2.7/plat-linux2', 
    '/usr/lib64/python2.7/lib-tk', '/usr/lib64/python2.7/lib-old', '/usr/lib64/python2.7/lib-dynload', 
    '/usr/lib64/python2.7/site-packages', '/usr/lib/python2.7/site-packages'])

     

     

     

    可以看出:

    (a) 当作文件夹执行的时候,__init__.py 不会被执行。对于 __main__.py 来说,变量 __package__ 是一个空字符串。
    当作模块执行的时候,会先执行 __init__.py ,再执行 __main__.py 。对于 __main__.py 来说,变量 __package__ 是 Package 的名字。
    另外, __init__.py 和 __main__.py 中的 __name__变量的值是不同的。


    (b) 对于一个 Package 来说,既然 __init__.py 必须存在,并且当作为模块执行的时候,它会先执行,我们就应该把入口函数 main() 定义在 __init__.py 中。
    当我们使用模块方式 -m 执行的时候, __init__.py 定义了 main() 函数,然后在 __main__.py 中调用它,就能实现我们统一入口的目的。

     

    (2) 案例2


    对 __init__.py 做如下修改:

    #!/usr/bin/env python
    import sys
     
    print('__init__')
    print('__init__.__name__', __name__)
    print('__init__.__package__', __package__)
     
    print('sys.path', sys.path)
     
    def main():
        print('__init__.main()')

     

    对 __main__.py 做如下修改:

     

    #!/usr/bin/env python
    import sys
     
    print('__main__')
    print('__main__.__name__', __name__)
    print('__main__.__package__', __package__)
     
    print('sys.path', sys.path)
     
    import pkg
    pkg.main()

     

     

     

    执行 python pkg ,调用失败;执行 python -m pkg,调用正常。对比一下它们的输出结果:

     

    [root@localhost test_08_10]# python pkg
    __main__
    ('__main__.__name__', '__main__')
    ('__main__.__package__', '')
    ('sys.path', ['pkg', '/usr/lib64/python27.zip', '/usr/lib64/python2.7', '/usr/lib64/python2.7/plat-linux2',
     '/usr/lib64/python2.7/lib-tk', '/usr/lib64/python2.7/lib-old', '/usr/lib64/python2.7/lib-dynload',
     '/usr/lib64/python2.7/site-packages', '/usr/lib/python2.7/site-packages'])
    Traceback (most recent call last):
      File "/usr/lib64/python2.7/runpy.py", line 162, in _run_module_as_main
        "__main__", fname, loader, pkg_name)
      File "/usr/lib64/python2.7/runpy.py", line 72, in _run_code
        exec code in run_globals
      File "/home/lws/python/test_08_10/pkg/__main__.py", line 10, in <module>
        import pkg
    ImportError: No module named pkg
    [root@localhost test_08_10]# 
    [root@localhost test_08_10]# 
    [root@localhost test_08_10]# 
    [root@localhost test_08_10]# 
    [root@localhost test_08_10]# python -m pkg
    __init__
    ('__init__.__name__', 'pkg')
    ('__init__.__package__', 'pkg')
    ('sys.path', ['', '/usr/lib64/python27.zip', '/usr/lib64/python2.7', '/usr/lib64/python2.7/plat-linux2',
     '/usr/lib64/python2.7/lib-tk', '/usr/lib64/python2.7/lib-old', '/usr/lib64/python2.7/lib-dynload',
     '/usr/lib64/python2.7/site-packages', '/usr/lib/python2.7/site-packages'])
    __main__
    ('__main__.__name__', '__main__')
    ('__main__.__package__', 'pkg')
    ('sys.path', ['', '/usr/lib64/python27.zip', '/usr/lib64/python2.7', '/usr/lib64/python2.7/plat-linux2',
     '/usr/lib64/python2.7/lib-tk', '/usr/lib64/python2.7/lib-old', '/usr/lib64/python2.7/lib-dynload',
     '/usr/lib64/python2.7/site-packages', '/usr/lib/python2.7/site-packages'])
    __init__.main()
    [root@localhost test_08_10]# 

     

     

    原因在于,sys.path 的第一个搜索路径,一个是 pkg ,一个是空字符串。
    对于 python -m pkg 的调用方式来说,由于 __init__.py 被事先载入,此时 python 解释器已经知道了这是一个 package ,
    因此当前路径(空字符串)被包含在 sys.path 中。然后再调用 __main__.py ,这时 import pkg 这个包就没有问题了。

    而对于 python hhlb 的调用方式来说,由于 __init__.py 没有被载入,python 解释器并不知道自己正在一个 Package 下面工作。
    默认的,python 解释器将 __main__.py 的当前路径 pkg 加入 sys.path 中,然后在这个路径下面寻找 pkg 这个模块。显然, pkg 文件夹下面并没有 pkg 这个模块,因此出错。

    要理解这点,就要明白 __init__.py 是 python 解释器将当前文件夹作为 Package 处理的必要条件。
    如果没有读取到 __init__.py ,python 就不会认为当前的文件夹是一个 Package,而只是把它当作普通文件夹来处理。

    既然找到了问题原因,那么只需要把当前路径加入到 sys.path 中,就能解决这个问题。

     

     

    修改后的 __main__.py 如下:

     

     

    #!/usr/bin/env python
    import os, sys
     
    print('__main__')
    print('__main__.__name__', __name__)
    print('__main__.__package__', __package__)
     
    if not __package__:
      path = os.path.join(os.path.dirname(__file__), os.pardir)
      sys.path.insert(0, path)
     
    print('sys.path', sys.path)
     
    import pkg
    pkg.main()

     

     

     

     

    执行 python pkg ,结果正常:

     

    [root@localhost test_08_10]# python pkg
    __main__
    ('__main__.__name__', '__main__')
    ('__main__.__package__', '')
    ('sys.path', ['/home/lws/python/test_08_10/pkg/..', 'pkg', '/usr/lib64/python27.zip', '/usr/lib64/python2.7', '/usr/lib64/python2.7/plat-linux2',
     '/usr/lib64/python2.7/lib-tk', '/usr/lib64/python2.7/lib-old', '/usr/lib64/python2.7/lib-dynload',
     '/usr/lib64/python2.7/site-packages', '/usr/lib/python2.7/site-packages'])
    __init__
    ('__init__.__name__', 'pkg')
    ('__init__.__package__', 'pkg')
    ('sys.path', ['/home/lws/python/test_08_10/pkg/..', 'pkg', '/usr/lib64/python27.zip', '/usr/lib64/python2.7', '/usr/lib64/python2.7/plat-linux2',
     '/usr/lib64/python2.7/lib-tk', '/usr/lib64/python2.7/lib-old', '/usr/lib64/python2.7/lib-dynload',
     '/usr/lib64/python2.7/site-packages', '/usr/lib/python2.7/site-packages'])
    __init__.main()
    [root@localhost test_08_10]#

     

     

     

     

    看到这里,有人可能会提出两个问题:

    1. 为什么不直接在 sys.path 前面加上一个空字符串来解决问题呢? 

    答:因为,如果不是在当前路径下调用,空字符串就没效果了,比如执行 python /path/to/pkg。


    2. 为什么不用 if __package__ == '' 来判断 __package__ 的值呢?

    答:这并不是偷懒。因为可能会出现这种调用(不推荐): python pkg/__main__.py 。而这种情况下, __package__ 的值就是 None 而不是 '' 了。

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    本文转自:

    https://blog.csdn.net/ywcpig/article/details/51179547

     

     

     

     

     

     

    展开全文
  • __ init __.py what is init.py? 通常在一个工程文件里面,我可能会发现在某个文件夹下面会有一个命名为__init__.pypy文件 why need init.py? 在一个工程文件下面,我们可能会有很多的py文件(模块),文件太多,...
  • python模块中__init__.py的作用

    万次阅读 多人点赞 2018-03-05 14:22:26
    实验一:不包含__init__.py 实验二:A中包含__init__.py 实验三:A.A_A中也包含__init__.py 进阶 基本概念 概念 解释 import 即导入,方式就是在import位置将代码文件拷贝过去。 模块 python...

    基本概念

    概念解释
    import即导入,方式就是在import位置将代码文件拷贝过去。
    模块python中一个.py文件就是一个模块
    指软件包,举例import matplotlib.pyplot中(其中pyplot非函数,至少是一个模块或者包),matplotlib就是一个软件包。

    先上结论

    __init__.py的作用是让一个呈结构化分布(以文件夹形式组织)的代码文件夹变成可以被导入import的软件包。

    举例解释

    为了形象地解释,我建立了一个test文件夹,其中一个文件夹A打算建立成一个软件包,然后尝试在B文件夹的的run.py文件下导入A包中的模块。

    实验一:不包含__init__.py

    test文件夹中包含的文件如下:
    layout
    此时如果在B/run.py中运行以下语句的结果为:

    语句运行结果
    import AImportError: No module named A
    import A.A_AImportError: No module named A.A_A
    import A.A_BImportError: No module named A.A_B

    结论:此时A并不能被当成是一个软件包。

    实验二:A中包含__init__.py

    A文件夹下包含__init__.pytest文件夹结构变为如下:
    layout1
    B/run.py中运行以下语句的结果依次列在表中:

    语句运行结果
    import A成功
    import A.A_AImportError: No module named A_A
    import A.A_B成功

    结论:由A.A_B能被成功import看出此时A已经是一个软件包,因为A下的.py文件已经能够程序识别出来。但是由于A下的A_A还不是一个软件包,所以A.A_A还不能被导入。

    实验三:A.A_A中也包含__init__.py

    A文件夹及其子文件夹下都包含__init__.pytest文件夹结构变为如下:
    layout2

    B/run.py中运行以下语句的结果依次为:

    语句运行结果
    import A.A_B成功
    import A.A_A成功
    import A.A_A.A_A_A成功

    结论:此时A及其子文件夹A_A都成功变成软件包,其中的模块可以被任意导入。

    进阶

    • 在上述实验中,发现导入A时并未将其下的子模块自动导入,当__init__.py文件不为空时,其中可以填写from . import A_A类似语句实现自动子模块导入。

    • 不含有__init__.py的包也可以当作命名空间包使用,使命名一致的包被统一管理。

    展开全文
  • 主要介绍了Python模块包中__init__.py文件功能,简单分析了__init__.py在调入模块和包的过程中的作用,需要的朋友可以参考下
  • __init__.py

    千次阅读 2011-06-21 09:18:00
    在目录内增加一个 __init__.py使得该目录可以被当作模块导入 init_test/ |___ test/ | |__ __init__.py | |__ test.py |___ test.py #init_test/test/__init__.py

    在目录内增加一个 __init__.py使得该目录可以被当作模块导入
    init_test/
          |___ test/
          |         |__  __init__.py
          |         |__  test.py
          |___ test.py

    #init_test/test/__init__.py
    # -*- coding: utf-8 -*-
    print("in test/__init__.py")

    #init_test/test/test.py
    # -*- coding: utf-8 -*-
    print("in test/test.py")
    print("module name:",__name__);
    def test_hello():
        print("hello from test.test.test_hello");

    --------------------测试程序1----------------------------
    #init_test/test.py
    # -*- coding: utf-8 -*-
    import test
    import test.test
    test.test.test_hello()

    #程序运行结果:
    in test/__init__.py
    in test/test.py
    module name: test.test
    hello from test.test.test_hello

    --------------------测试程序2----------------------------
    #init_test/test.py
    # -*- coding: utf-8 –*-
    #import test
    import test.test
    test.test.test_hello()

    #程序运行结果:
    in test/__init__.py
    in test/test.py
    module name: test.test
    hello from test.test.test_hello

    --------------------测试程序3----------------------------
    #init_test/test.py
    # -*- coding: utf-8 -*-
    import test               #
    #import test.test
    #test.test.test_hello()

    #程序运行结果:
    in test/__init__.py

    __init__.py 使得该文件可以被当作模块导入
    import test  #只运行 test/__init__.py

    import test.test  #如果第一次导入 test 内的文件,则先运行 test/__init__.py,再运行 test/test.py;否则只运行 test/test.py

    展开全文
  • __main__.py 和 __init__.py

    千次阅读 2016-06-07 14:06:23
    __init__.__package__ hhlb __main__ __main__.__name__ __main__ __main__.__package__ hhlb 当作为模块执行的时候,python 会先执行  __init__.py  ,然后执行 __main__.py  。而且,前者和后者对于 ...
  • 主要介绍了Python包,__init__.py功能与用法,结合实例形式分析了Python中包的概念、功能及__init__.py初始化相关操作技巧,需要的朋友可以参考下
  • __init__.py 文件的作用是将文件夹变为一个Python模块,Python 中的每个模块的包中,都有__init__.py 文件.这篇文章主要介绍了Python中__init__.py文件的作用详解,非常不错,具有参考借鉴价值,需要的朋友可以参考下
  • 参考:https://stackoverflow.com/questions/448271/what-is-init-py-for Python定义了两种类型的包,常规包(regular package)和命名空间包...一个常规的包通常被实现为一个包含一个_init_ .py文件的目录。当导...
  • 项目结构和__init__.py作用

    千次阅读 2019-05-17 21:24:13
       __init__.py    dataset.py    get_data.py models/   __init__.py    shuffleNetV2.py    ResNet.py utils/    __init__.py config.py main.py requirement.txt README.md 二、作用 1. ...
  • python __init__.py __name__ __doc__ __file__ argv[0]
  • __init__.py的作用

    千次阅读 多人点赞 2019-08-19 23:03:41
    __init.py__的作用是简化导入语句。 1 没有__init__.py时导入函数 我们先来看看没有__init.py__时是怎么导入模块和函数的。假设我的目录结构如下: . # main.py所在目录 |- main.py |- my_module1.py |- my_...
  • python中__init__.py文件的作用

    千次阅读 2018-07-23 09:36:03
    在我们使用Pycharm等IDE创建python包时,总是会生成一个__init__.py文件,那么这个__init__.py文件究竟有什么作用呢? # python包 &gt; test &gt; __init__.py &gt; a.py &gt; b.py 1. Python...
  • Python __init__.py 作用详解

    万次阅读 2019-06-06 14:27:03
    Python init.py 作用详解 init.py 文件的作用是将文件夹变为一个Python模块,Python 中的每个模块的包中,都有__init__.py 文件。 通常__init__.py 文件为空,但是我们还可以为它增加其他的功能。我们在导入一个包时...
  • __init__.py的用法

    千次阅读 2019-05-14 10:31:53
    1."__init__.py"是什么 当文件夹下有__init__.py时,表示当前文件夹是一个‘“包”package,其下的多个模块module统一构成一个整体。这些module都可以通过同一个package引入代码中 2."__init__.py"怎么用 实际上...
  • python文件夹中__init__.py的用处

    千次阅读 2017-06-27 10:21:03
    看到很多人写的python项目中,在一个特定文件夹下面经常放一个__init__.py文件,刚开始很诧异,然后就百度看了一下其他人的理解,然后归纳如下: 1,__init__.py的作用是把一个文件夹变成了一个python模块,python...
  • Python包中__init__.py作用

    千次阅读 2019-01-16 14:31:47
    基本作用:当一个包被导入的时候或者当导入一个包下面的一个模块的变量的时候,__init__.py文件将首先被执行,而且是被python自动去执行,不需要手动的去执行。一般在项目中用来做一些初始化工作。 在创建python包...
  • Python __init__.py 文件使用

    千次阅读 2019-05-02 19:50:19
    __init__.py的主要作用是: 1. Python中package的标识,不能删除 2. 定义__all__用来模糊导入 3. 编写Python代码(不建议在__init__中写python模块,可以在包中在创建另外的模块来写,尽量保证__init__.py简单) ...
  • __init__.py 作用详解

    千次阅读 2018-04-11 10:41:43
    Python __init__.py 作用详解原来在python模块的每一个包中,都有一个__init__.py文件(这个文件定义了包的属性和方法)然后是一些模块文件和子目录,假如子目录中也有 __init__.py 那么它就是这个包的子包了。...
  • python __init__.py文件

    千次阅读 2016-10-21 10:58:42
    python __init__.py
  • __init__.py 包文件

    2015-12-31 16:26:07
    如果选择使用包导入,就必须遵循一条约束:包导入的路径中的每一个目录中一定要包含__init__.py文件,否则导入包会失败。  __init__.py可以包含python代码,就像普通的模块文件。这类文件从某种程度上讲就像是python...
  • python __init__.py的主要作用

    千次阅读 2019-01-06 11:36:19
    __init__.py的主要作用 Python中 package的标识 在__init__.py中定义__all__用来模糊导入 编写Python代码(不建议这么做,实际的逻辑可以在其他py文件中写,__init__.py应该尽量轻) package标识 在pycharm中new,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 223,345
精华内容 89,338
关键字:

__init__.py