python __main__ 和 __init__ 正确使用

im_*_*ous 8 python program-entry-point initialization

因为我对 python 比较陌生,所以语言的这个特殊方面对我来说仍然不透明。

因此,假设我的项目包含许多文件,其中包含执行操作的代码和两个“服务”文件:__init__.py__main__.py

__init__.py只有:

if __name__ == "__main__":
    import package.__main__
    __main__.main()
Run Code Online (Sandbox Code Playgroud)

并在__main__.py如下:

import package # ok
import package2 # ok

def main():
    package.myfunc1() # can't find reference to myfunc1
    package2.myfunc2() # can't find reference to myfunc2
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:为什么两个包都可见而里面的函数不可见?我已经从谷歌阅读了一些源代码,但仍然无法发现它和我的代码之间的区别。我正在使用Python 3.5.1

我认为,在该代码__init__将推出__main____main__将推出的我的其余功能。

UPD

好吧,如果我将某人与我的代码混淆,我深表歉意。支持的想法__init__.py是该文件是在添加第一个包时由 IDE 创建的,所以我决定用在第一个 github 条目中找到的代码填充它(我的错,我虽然它可以通过复制粘贴重新使用)。

严格来说,我只需要 python 构造,相当于这个 C 代码:

header.h
void func1(){...} //in code1.c
void func2(){...} //in code2.c
#include "header.h"
int main() //in main.c 
{
    func1();
    func2();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

以及以下代码

import package
import package2 

if __name__ == "__main__":
    package.myfunc1() 
    package2.myfunc2() 
Run Code Online (Sandbox Code Playgroud)

有与上述完全相同的问题,所以问题不在 __init__.py

hpa*_*ulj 5

我做了:

foo/
  __init__.py
  __main__.py
Run Code Online (Sandbox Code Playgroud)

2个文件是:

# __init__.py
import __main__
print('in init')
print('init name',__name__)
Run Code Online (Sandbox Code Playgroud)

# __main__.py
print('main name',__name__)
print('in main')    
if __name__=='__main__':
    print('in main main block')
Run Code Online (Sandbox Code Playgroud)

如果我__main__直接运行:

1538:~/mypy$ python foo/__main__.py
('main name', '__main__')
in main
in main main block
Run Code Online (Sandbox Code Playgroud)

如果我调用目录,它会做同样的事情。它不导入__init__.py.

1541:~/mypy$ python foo
('main name', '__main__')
in main
in main main block
Run Code Online (Sandbox Code Playgroud)

但是从 shell 加载这两个文件

1542:~/mypy$ python
....
>>> import foo
('main name', 'foo.__main__')
in main
in init
('init name', 'foo')
Run Code Online (Sandbox Code Playgroud)

但它不使用if __name____main__- 名称不对,现在是foo.__main__.


相关文档

https://docs.python.org/2/using/cmdline.html#interface-options

执行脚本中包含的 Python 代码,它必须是一个文件系统路径(绝对或相对),引用 Python 文件、包含__main__.py文件的目录或包含__main__.py文件的 zipfile 。

https://docs.python.org/2/library/\__main__.html

该模块表示解释器主程序执行的(否则匿名)范围——从标准输入、脚本文件或交互式提示中读取的命令。正是在这种环境中,惯用的“条件脚本”节导致脚本运行:


我创建了另一个目录,__init__.py但没有主目录:

1558:~/mypy$ python foo1
/usr/bin/python: can't find '__main__' module in 'foo1'
1558:~/mypy$ python
...
>>> import foo1
('in init', 'foo1')
>>> 
Run Code Online (Sandbox Code Playgroud)

import工作,但我不能run目录。


Clo*_*ion 2

出色地:

__init__.py 有用import(所有子目录都搜索导入)

if __name__ == "__main__":

用于运行模块本身。但是如果在其他脚本中导入这部分代码将不会被执行