python __main__和__init__正确使用

时间:2016-02-07 20:47:08

标签: python initialization main

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

因此,假设我的项目包含许多文件,其代码可以执行操作,并且包含两个" service"文件:__init__.py__main__.py

__init__.py中只有:

if __name__ == "__main__":
    import package.__main__
    __main__.main()

__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

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

我认为,__init__中的代码将启动__main____main__将启动其余功能。

UPD

好吧,如果我把某人与我的代码混淆了,我很抱歉。 支持__init__.py的想法是该文件是在第一个包添加时由IDE创建的,因此我决定在第一个github条目中找到code填充它(我的错,我可以重新编写) - 通过复制粘贴使用)。

严格来说,我只需要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;
}

以下代码

import package
import package2 

if __name__ == "__main__":
    package.myfunc1() 
    package2.myfunc2() 

与上述问题完全相同,因此问题不在__init__.py

3 个答案:

答案 0 :(得分:3)

我做了:

foo/
  __init__.py
  __main__.py

有两个文件:

import __main__
print('in init')
print('init name',__name__)

print('main name',__name__)
print('in main')    
if __name__=='__main__':
    print('in main main block')

如果我直接运行__main__

1538:~/mypy$ python foo/__main__.py
('main name', '__main__')
in main
in main main block

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

1541:~/mypy$ python foo
('main name', '__main__')
in main
in main main block

但是从shell中,它会加载两个文件

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

但它不使用if __name__的{​​{1}}块 - 名称不对,它现在是__main__

相关文档

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

  

执行脚本中包含的Python代码,该代码必须是文件系统路径(绝对路径或相对路径),指向Python文件,包含foo.__main__文件的目录或包含__main__.py的zipfile。文件。

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

  

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

我创建了另一个目录,其中包含__main__.py但没有主目录:

__init__.py

1558:~/mypy$ python foo1 /usr/bin/python: can't find '__main__' module in 'foo1' 1558:~/mypy$ python ... >>> import foo1 ('in init', 'foo1') >>> 有效,但我无法import目录。

答案 1 :(得分:2)

好:

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

并且

if __name__ == "__main__":

用于运行模块本身。但是如果在其他脚本

中导入,则不会执行这段代码

答案 2 :(得分:0)

所以,正如有关此类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;
}

有某种python解决方案:

def func1() #  in function1.py in package Foopackage
def func2() #  in function2.py in package Foopackage

如下__main__.py

import Foopackage.function1 as f1
import Foopackage.function2 as f2


def main():
    f1.func1()
    f2.func2()

if __name__ == "__main__":
    main()

不需要__init__.py。在我的情况下,假设所有文件都位于同一目录中。

欢迎任何更正。