Python__main__并__init__正确的用法



因为我对python相当陌生,所以语言的这一特定方面对我来说仍然不透明。

因此,假设我的项目包含许多文件,其中包含执行操作的代码和两个"服务"文件:__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 条目上的代码填充它(我的错,虽然它可以通过复制粘贴重用(。

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

我做了:

foo/
  __init__.py
  __main__.py

与 2 个文件是:

# __init__.py
import __main__
print('in init')
print('init name',__name__)

# __main__.py
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')

但它没有使用__main__if __name__块 - 名称不对,现在是foo.__main__.

<小时 />

相关文档

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

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

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')
>>> 

import工作,但我无法run目录。

嗯:

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

if __name__ == "__main__":

用于运行模块本身。但是如果在其他脚本中导入,则不会执行此代码

所以,正如对这种 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。在我的情况下,假设所有文件都位于同一目录中。

欢迎任何更正。

相关内容

  • 没有找到相关文章

最新更新