代码之家  ›  专栏  ›  技术社区  ›  sharvey

在main.py中使用模块自己的对象

  •  41
  • sharvey  · 技术社区  · 14 年前

    我试图从它的内部访问模块数据 __main__.py .

    mymod/
        __init__.py
        __main__.py
    

    __init__.py 这样地:

    __all__ = ['foo']
    foo = {'bar': 'baz'}
    

    如何访问 foo __主\uuuuuuuuuuuy.py ?

    5 回复  |  直到 12 年前
        1
  •  23
  •   Community CDub    8 年前

    sys.path ,添加包含 mymod 搜索路径 在里面 __main__.py ,或使用 -m

    添加 mymod公司 这条路看起来像这样 __主\uuuuuuuuuuuy.py ):

    import sys
    import os
    path = os.path.dirname(sys.modules[__name__].__file__)
    path = os.path.join(path, '..')
    sys.path.insert(0, path)
    from myprog import function_you_referenced_from_init_file
    

    -米 交换机希望:

    python -m mymod
    

    this answer 更多讨论。

        2
  •  4
  •   Community CDub    5 年前

    __init__.py 文件作为脚本来测试功能,但在加载包时不应运行这些功能。对于不同的执行路径,有一个有用的解决方法 python <package>/__init__.py python -m <package> .

    • $ python -m <module> 执行 <package>/__main__.py 未加载。
    • $ python <package>/__init__.py __初始值 就像一个普通的剧本。

    问题

    当我们需要的时候 __初始值 有一个 if __name__ == '__main__': ... 使用 __main__.py . 我们不能进口 __主\uuuuuuuuuuuy.py __main__.pyc 从解释器路径( 除非 我们求助于绝对路径导入黑客,这可能会导致许多其他混乱)。


    解决方案 解决方案:)

    __main__ :

    <package>/
             __init__.py
             __main__.py
             main.py
    

    # __init__.py
    
    # ...
    # some code, including module methods and __all__ definitions
    
    __all__ = ['foo', 'bar']
    bar = {'key': 'value'}
    def foo():
        return bar
    # ...
    if __name__ == '__main__':
        from main import main
        main.main()
    

    # __main__.py
    
    # some code...such as:
    import sys
    if (len(sys.argv) > 1 and sys.argv[1].lower() == 'option1'):
        from main import main()
        main('option1')
    elif (len(sys.argv) > 1 and sys.argv[1].lower() == 'option2'):
        from main import main()
        main('option2')
    else:
        # do something else?
        print 'invalid option. please use "python -m <package> option1|option2"'
    

    # main.py
    
    def main(opt = None):
        if opt == 'option1':
            from __init__ import foo
            print foo()
        elif opt == 'option2':
            from __init__ import bar
            print bar.keys()
        elif opt is None:
            print 'called from __init__'
    

    main.py 在我们逃跑的情况下可能不太理想 ,因为我们正在将它们重新加载到另一个模块的本地范围中,尽管已将它们加载到 __初始值 __init__ 在您的 主.py ,则不会加载为 __主要__

        3
  •  2
  •   Josh Lee ZZ Coder    14 年前

    这个 __init__ a package 行为类似于包本身的成员,因此对象直接从 mymod :

    from mymod import foo
    

    from . import foo
    

    如果你想简明扼要,那就读一读关于 relative imports . 像往常一样,您需要确保不会像以前那样调用模块 mymod/__main__.py ,例如,这将阻止Python检测 作为一个包裹。你也许想调查一下 distutils

        4
  •  1
  •   glyphobet    13 年前

    如果你用 python -m mymod __main__.py 将能够从模块的其余部分导入,而无需将模块添加到 sys.path .

        5
  •  -2
  •   Nisan.H    12 年前

    模块目录结构如下:

    py/
       __init__.py
       __main__.py
    

    __初始值

    #!/usr/bin/python3
    #
    # __init__.py
    #
    
    __all__ = ['foo']
    foo = {'bar': 'baz'}
    info = { "package": __package__,
             "name": __name__,
             "locals": [x for x in locals().copy()] }
    print(info)
    

    __主\uuuuuuuuuuuy.py

    #!/usr/bin/python3
    #
    # __main__.py
    #
    
    info = { "package": __package__,
             "name": __name__,
             "locals": [x for x in locals().copy()] }
    print(info)
    from . import info as pyinfo
    print({"pyinfo: ": pyinfo})
    

    使用 -m

    $ python -m py

    # the printout from the 'print(info)' command in __init__.py
    {'name': 'py', 'locals': ['__all__', '__builtins__', '__file__', '__package__', '__path__', '__name__', 'foo', '__doc__'], 'package': None}
    # the printout from the 'print(info)' command in __main__.py
    {'name': '__main__', 'locals': ['__builtins__', '__name__', '__file__', '__loader__', '__doc__', '__package__'], 'package': 'py'}
    # the printout from the 'print(pyinfo)' command in __main__.py
    {'pyinfo: ': {'name': 'py', 'locals': ['__all__', '__builtins__', '__file__', '__package__', '__path__', '__name__', 'foo', '__doc__'], 'package': None}}