python主程序和初始程序

2024-10-06 13:07:25 发布

您现在位置:Python中文网/ 问答频道 /正文

因为我对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

所以我的问题是:为什么两个包都是可见的,而里面的函数却不是?我从google上读过一些源代码,但仍然看不出它和我的代码之间的区别。我在用Python 3.5.1

我假设__init__中的代码将启动__main__,并且__main__将启动我的其余函数。

升级版

好吧,如果我把别人和我的代码搞混了,我很抱歉。 支持__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


Tags: 文件代码nameinpyimportpackageif
3条回答

所以,如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。在我的例子中,假设所有文件都位于同一目录中。

欢迎修改。

嗯:

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

以及

if __name__ == "__main__":

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

我做了:

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

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


相关文件

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

Execute the Python code contained in script, which must be a filesystem path (absolute or relative) referring to either a Python file, a directory containing a __main__.py file, or a zipfile containing a __main__.py file.

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

This module represents the (otherwise anonymous) scope in which the interpreter’s main program executes — commands read either from standard input, from a script file, or from an interactive prompt. It is this environment in which the idiomatic “conditional script” stanza causes a script to run:


我用__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目录。

相关问题 更多 >