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
我做了:
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目录。
出色地:
__init__.py
有用import(所有子目录都搜索导入)
和
if __name__ == "__main__":
用于运行模块本身。但是如果在其他脚本中导入这部分代码将不会被执行