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__ 将启动我的其余功能。

更新程序

好吧,如果我把别人和我的代码搞混了,我深表歉意。背后的想法 __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

原文由 im_infamous 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 581
1 个回答

我做了:

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

但它不使用 if __name____main__ 名称不正确,现在是 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 目录。

原文由 hpaulj 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题