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