因为我对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__.py
对import
很有用(所有子目录都搜索导入(
和
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
。在我的情况下,假设所有文件都位于同一目录中。
欢迎任何更正。