精华内容
下载资源
问答
  • 如何简单地理解Python中的if __name__ == '__main__'

    万次阅读 多人点赞 2017-09-09 22:35:42
    1. 摘要通俗的理解__name__ == '__main__':假如你叫小明.py,在朋友眼中,你是小明(__name__ == '小明');在你自己眼中,你是你自己(__name__ == '__main__')。if __name__ == '__main__'的意思是:当.py文件被直接...

    1. 摘要

    通俗的理解__name__ == '__main__':假如你叫小明.py,在朋友眼中,你是小明(__name__ == '小明');在你自己眼中,你是你自己(__name__ == '__main__')

    if __name__ == '__main__'的意思是:当.py文件被直接运行时,if __name__ == '__main__'之下的代码块将被运行;当.py文件以模块形式被导入时,if __name__ == '__main__'之下的代码块不被运行。


    2. 程序入口

    对于很多编程语言来说,程序都必须要有一个入口,比如C,C++,以及完全面向对象的编程语言Java,C#等。如果你接触过这些语言,对于程序入口这个概念应该很好理解,C,C++都需要有一个main函数作为程序的入口,也就是程序的运行会从main函数开始。同样,Java,C#必须要有一个包含Main方法的主类,作为程序入口。

    而Python则不同,它属于脚本语言,不像编译型语言那样先将程序编译成二进制再运行,而是动态的逐行解释运行。也就是从脚本第一行开始运行,没有统一的入口。

    一个Python源码文件(.py)除了可以被直接运行外,还可以作为模块(也就是库),被其他.py文件导入。不管是直接运行还是被导入,.py文件的最顶层代码都会被运行(Python用缩进来区分代码层次),而当一个.py文件作为模块被导入时,我们可能不希望一部分代码被运行。

    2.1 一个.py文件被其他.py文件引用

    假设我们有一个const.py文件,内容如下:

    PI = 3.14
    
    def main():
        print("PI:", PI)
    
    main()
    
    # 运行结果:PI: 3.14

    现在,我们写一个用于计算圆面积的area.py文件,area.py文件需要用到const.py文件中的PI变量。从const.py中,我们把PI变量导入area.py:

    from const import PI
    
    def calc_round_area(radius):
        return PI * (radius ** 2)
    
    def main():
        print("round area: ", calc_round_area(2))
    
    main()
    
    '''
    运行结果:
    PI: 3.14
    round area:  12.56
    '''

    2.2 修改const.py,添加if __name__ == "__main__"

    我们看到const.py中的main函数也被运行了,实际上我们不希望它被运行,因为const.py提供的main函数只是为了测试常量定义。这时if __name__ == '__main__'派上了用场,我们把const.py改一下,添加if __name__ == "__main__"

    PI = 3.14
    
    def main():
        print("PI:", PI)
    
    if __name__ == "__main__":
        main()

    运行const.py,输出如下:

    PI: 3.14

    运行area.py,输出如下:

    round area:  12.56

    如上,我们可以看到if __name__ == '__main__'相当于Python模拟的程序入口,Python本身并没有这么规定,这只是一种编码习惯。由于模块之间相互引用,不同模块可能有这样的定义,而程序入口只有一个。到底哪个程序入口被选中,这取决于__name__的值。

    3. __name__

    3.1 __name__反映一个包的结构

    __name__是内置变量,可用于反映一个包的结构。假设我们有一个包a,包的结构如下:

    a
    ├── b
    │   ├── c.py
    │   └── __init__.py
    └── __init__.py

    在包a中,文件c.py,__init__.py,__init__.py的内容都为:

    print(__name__)

    当一个.py文件(模块)被其他.py文件(模块)导入时,我们在命令行执行

    python -c "import a.b.c"

    输出结果:

    a
    a.b
    a.b.c

    由此可见,__name__可以清晰地反映一个模块在包中的层次。

    3.2 __name__表示当前模块的名字

    __name__是内置变量,可用于表示当前模块的名字。我们直接运行一个.py文件(模块)

    python a/b/c.py

    输出结果:

    __main__

    由此我们可知:如果一个.py文件(模块)被直接运行时,则其没有包结构,其__name__值为__main__,即模块名为__main__

    所以,if __name__ == '__main__'的意思是:当.py文件被直接运行时,if __name__ == '__main__'之下的代码块将被运行;当.py文件以模块形式被导入时,if __name__ == '__main__'之下的代码块不被运行。


    4. __main__.py文件与python -m

    Python的-m参数用于将一个模块或者包作为一个脚本运行,而__main__.py文件相当于是一个包的“入口程序“。

    4.1 运行Python程序的两种方式

    • python xxx.py,直接运行xxx.py文件
    • python -m xxx.py,把xxx.py当做模块运行

    假设我们有一个文件run.py,内容如下:

    import sys
    
    print(sys.path)

    我们用直接运行的方式启动

    python run.py

    输出结果(为了说明问题,输出结果只截取了重要部分,下同):

    ['/home/huoty/aboutme/pythonstudy/main', ...]

    然后以模块的方式运行:

    python -m run.py

    输出内容

    ['', ...]
    /usr/bin/python: No module named run.py

    由于输出结果只列出了关键的部分,应该很容易看出他们之间的差异:

    • 直接运行方式是把run.py文件所在的目录放到了sys.path属性中

    • 以模块方式运行是把你输入命令的目录(也就是当前工作路径),放到了 sys.path 属性中。

    以模块方式运行还有一个不同的地方:多出了一行No module named run.py的错误。实际上以模块方式运行时,Python先对run.py执行一遍 import,所以print(sys.path)被成功执行,然后Python才尝试运行run.py模块,但是在path变量中并没有run.py这个模块,所以报错。正确的运行方式,应该是python -m run

    4.2 __main__.py的作用

    仍然先看例子,假设我们有如下一个包package:

    package
    ├── __init__.py
    └── __main__.py

    其中,文件__init__.py的内容

    import sys
    
    print("__init__")
    print(sys.path)

    其中,文件__main__.py的内容

    import sys
    
    print("__main__")
    print(sys.path)

    接下来,我们运行这个package,使用python -m package运行,输出结果:

    __init__
    ['', ...]
    
    __main__
    ['', ...]

    使用python package运行,输出结果:

    __main__
    ['package', ...]

    总结一下

    • 当加上-m参数时,Python会把当前工作目录添加到sys.path中;而不加-m时,Python则会把脚本所在目录添加到sys.path中。

    • 当加上-m参数时,Python会先将模块或者包导入,然后再执行。

    • __main__.py文件是一个包或者目录的入口程序。不管是用python package还是用python -m package运行,__main__.py文件总是被执行。

    5. 参考文章

    1. Python 中的 if name == ‘main’ 该如何理解

    展开全文
  • Python中if __name__ == '__main__':的作用和原理

    万次阅读 多人点赞 2019-05-06 11:37:52
    if __name__ == '__main__':的作用 一个python文件通常有两种使用方法,第一是作为脚本直接执行,第二是 import 到其他的 python 脚本中被调用(模块重用)执行。因此if __name__ == 'main':的作用就是控制这两种...

    if __name__ == '__main__':的作用

    一个python文件通常有两种使用方法,第一是作为脚本直接执行,第二是 import 到其他的 python 脚本中被调用(模块重用)执行。因此 if __name__ == 'main': 的作用就是控制这两种情况执行代码的过程,在 if __name__ == 'main': 下的代码只有在第一种情况下(即文件作为脚本直接执行)才会被执行,而 import 到其他脚本中是不会被执行的。举例说明如下:

    • 直接执行

    直接执行 test.py,结果如下图,可以成功 print 两行字符串。即,if __name__=="__main__": 语句之前和之后的代码都被执行。

    • import 执行

    然后在同一文件夹新建名称为 import_test.py 的脚本,输入如下代码:

    执行 import_test.py 脚本,输出结果如下:

    只输出了第一行字符串。即,if __name__=="__main__": 之前的语句被执行,之后的没有被执行。

    if __name__ == '__main__':的运行原理

    每个python模块(python文件,也就是此处的 test.py 和 import_test.py)都包含内置的变量 __name__,当该模块被直接执行的时候,__name__ 等于文件名(包含后缀 .py );如果该模块 import 到其他模块中,则该模块的 __name__ 等于模块名称(不包含后缀.py)。

     “__main__” 始终指当前执行模块的名称(包含后缀.py)。进而当模块被直接执行,__name__ == 'main' 结果为真。

    为了进一步说明,我们在 test.py 脚本的 if __name__=="__main__": 之前加入 print(__name__),即将 __name__ 打印出来。文件内容和结果如下:

    可以看出,此时变量__name__的值为"__main__"。

    再执行 import_test.py,执行结果如下:

     

    此时,test.py中的__name__变量值为 test,不满足 __name__=="__main__" 的条件,因此,无法执行其后的代码。

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     


     

     

     

    展开全文
  • pip升级后Import Error:cannot import name main解决方案

    万次阅读 多人点赞 2018-05-22 19:29:05
    在Ubuntu上安装软件,不小心升级了pip,导致使用时报错如下 后来发现是因为将pip更新为10.0.0后库里面的函数有所变动...from pip import main 改为 from pip._internal import main 方法二: sudo gedit ...

    在Ubuntu上安装软件,不小心升级了pip,导致使用时报错如下

    后来发现是因为将pip更新为10.0.0后库里面的函数有所变动造成这个问题。 解决方法如下:

    方法一:

    sudo vim /usr/bin/pip

    注意,如果自己是要用pip3,则修改对应的/usr/bin/pip3,将原来的

    from pip import main

    改为

    from pip._internal import main

     方法二:

    sudo vim /usr/bin/pip

    将原来的:

    from pip import main
    if __name__ == '__main__':
        sys.exit(main())

    改为:

    from pip import __main__
    if __name__ == '__main__':
        sys.exit(__main__._main())

    就可以了,注意__main__左右的下划线是两个下划线,很多同学不成功的原因是因为只写了一个下划线

    展开全文
  • if __name__ == '__main__' 如何正确理解?

    万次阅读 多人点赞 2018-03-10 10:47:57
    在大多数编排得好一点的脚本或者程序里面都有这段if __name__ == 'main': ,虽然一直知道他的作用,但是一直比较模糊,收集资料详细理解之后与大家分享。 1、这段代码的功能 一个python的文件有两种使用的方法,第...

    在大多数编排得好一点的脚本或者程序里面都有这段if __name__ == 'main': ,虽然一直知道他的作用,但是一直比较模糊,收集资料详细理解之后与大家分享。

       1、这段代码的功能

       一个python的文件有两种使用的方法,第一是直接作为脚本执行,第二是import到其他的python脚本中被调用(模块重用)执行。因此if __name__ == 'main': 的作用就是控制这两种情况执行代码的过程,在if __name__ == 'main': 下的代码只有在第一种情况下(即文件作为脚本直接执行)才会被执行,而import到其他脚本中是不会被执行的。

      举个例子,下面在test.py中写入如下代码:

    print "I'm the first."
    if __name__=="__main__":
        print "I'm the second."
    并直接执行test.py,结果如下图,可以成功print两行字符串。即,if __name__=="__main__": 语句之前和之后的代码都被执行。

    pythonèæ¬æµè¯
    然后在同一文件夹新建名称为import_test.py的脚本,只输入如代码:

    import test
    执行import_test.py脚本,输出结果如下:
    if __name__=="__main__"æ¼ç¤º

    只输出了第一行字符串。即,if __name__=="__main__": 之前的语句被执行,之后的没有被执行。

       2、运行的原理

     每个python模块(python文件,也就是此处的test.py和import_test.py)都包含内置的变量__name__,当运行模块被执行的时候,__name__等于文件名(包含了后缀.py);如果import到其他模块中,则__name__等于模块名称(不包含后缀.py)。而“__main__”等于当前执行文件的名称(包含了后缀.py)。进而当模块被直接执行时,__name__ == 'main'结果为真。

     同样举例说明,我们在test.py脚本的if __name__=="__main__":之前加入print __name__,即将__name__打印出来。文件内容和结果如下,

    pythonèæ¬

      可以看出,此时变量__name__的值为"__main__";
      再执行import_test.py,模块内容和执行结果如下:

    __name__åé

      此时,test.py中的__name__变量值为test,不满足__name__=="__main__"的条件,因此,无法执行其后的代码。
    --------------------- 
    作者:xiaoxik 
    来源:CSDN 
    原文:https://blog.csdn.net/xiaoxik/article/details/78749361 
    版权声明:本文为博主原创文章,转载请附上博文链接!

    展开全文
  • Python中if __name__ == '__main__',__init__和self 的解析

    万次阅读 多人点赞 2018-09-03 10:32:21
    文章主要包括2部分内容,分别是if __name__ == '__main__'的解析和__init__与self的解析。 目录 1 if __name__ == '__main__' 1.1 摘要 1.2程序入口 1.2.1一个.py文件被其他.py文件引用 1.2.2修改const.py,...
  • 在C语言编程中通常会看到 **int main()、int main(void)、void main(void)、main()和main(void)、int main() 和 void 首先来看看标准的主函数写法是什么样的,在C99标准(ISO/IEC 9899:1999)的5.1.2.2.1 ...
  • python中的main函数

    万次阅读 多人点赞 2019-04-16 14:31:40
    python是一种解释型脚本语言,和C/C++语言不同,C/C++程序从main函数开始执行,python程序从开始到结尾顺序执行。先总结下python中的main函数的作用:让模块(函数)可以自己单独执行(调试),相当于构造了调用其它...
  • void main 和 int main的区别

    万次阅读 多人点赞 2018-09-13 18:54:44
    main是一切(控制台)程序都必须有的一个入口函数 main函数是否有返回值在绝大多数情况下无关紧要 因为main函数体内的代码一旦运行完毕 这个程序就结束了 int main() 主函数返回的值是0,即 return 0;这个...
  • 20191210 cuda、vs、opencv踩坑错误日记 vs中使用cuda 编译出现错误 unresolved external symbol initHistogram256 referenced in function main 解决方案: .cu文件-》属性-》通用-》item:设置为 cuda C/C++ ...
  • //--------------------------------------------------标准的main函数格式为:int main(int argc, char *argv[]); /*即返回值为整型,带两个参数,argc为命令行参数的个数,argv为指针数组, 前argc个指针为参数...
  • 前言 1255: 打怪升级(Java),写这个题目程序的时候,控制台提示如下错误: ... at oj1255.Main.main(Main.java:52) 然后我调试才发现,这个对象数组居然是null的,这我就不理解了,我明明写
  • Error: Run after build is not possible Main file has non-main package or doesn't contain main function 解决方法: 原因:源码需要建立在src目录下, 启动入口包名需要是main ...
  • [C/C++基础知识] main函数的参数argc和argv

    万次阅读 多人点赞 2014-03-05 01:13:37
    该篇文章主要是关于C++\C语言最基础的main函数的参数知识,是学习C++或C语言都必备的知识点.不知道你是否知道该知识?希望对大家有所帮助. 一.main()函数参数 通常我们在写主函数时都是void main()或int main() {.....
  • Python使用pip安装报错ModuleNotFoundError: No module named 'pip._internal.cli.main’的解决方法   大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博客地址...
  • int main与void main的区别

    千次阅读 2018-11-01 15:21:48
    正确而且标准的方式应该是int main()或者int main(int argc, char* argv[])
  • C++之 main() ,void main() ,int main()等区分

    千次阅读 多人点赞 2019-01-16 21:01:38
    1、各种main函数 大家在看各种C++代码主函数时,发现,写法有很多种,比如: int main() { //代码 return 0; } int main(int argc, char* argv[]){ //代码 return 0; } void main() { //代码 } //…… 2...
  • main和_main的区别

    千次阅读 2014-03-13 10:34:40
    具体介绍了main和_main的编译运行结果的区别 已经内在原因 可以很好的帮助理解系统的编译特点
  • 深度剖析c语言main函数---main函数的返回值

    万次阅读 多人点赞 2018-07-09 23:19:06
    在接下来的几篇博文中,我将对c语言的main函数进行深入的剖析,分别从函数返回值,函数参数,以及函数的执行顺序对main函数作一总结。本文主要聊聊main函数的返回值。 main函数的返回值  main函数的返回值用于...
  • IntelliJ 创建main函数快捷

    万次阅读 多人点赞 2014-12-30 17:50:57
    今天偶然发现了IntelliJ中 创建main函数的快捷键,依次还有for循环,System.out.println(); 在编写代码的时候直接输入psv就会看到一个psvm的提示,此时点击tab键一个main方法就写好了。 psvm 也就是public static ...
  • 为什么 main 方法是 public static void ?

    千次阅读 多人点赞 2020-04-19 15:27:59
    main方法是我们学习Java编程语言时知道的第一个方法,你是否曾经想过为什么main方法是public、static、void的。当然,很多人首先学的是C和C++,但是在Java中main方法与前者有些细微的不同,它不会返回任何值,为什么...
  • C语言中int main(void)与int main()的区别

    万次阅读 多人点赞 2019-09-14 18:57:10
    int main(void) 指此函数的参数为空,不能传入参数,若输入参数则会出错,但必须要有返回值,如return 0;。 int main()可以传入参数,程序可以不需要返回值。 但在c++中二者没有区别。 ...
  • void main 与 int main到底有什区别,而去int main里面的int与数据定义的int一样吗,有什么区别?
  • go语言的main函数

    万次阅读 2020-09-17 21:28:45
    main函数不能带参数 main函数不能定义返回值 main函数所在的包必须为mainmain函数中可以使用flag包来获取和解析命令行参数
  • 错误在类中找不到main方法,请将main方法定义为 public static void main(String[] args)否则 JavaFX 应用程序类必须扩展javafx.application.Application 看到这样的问题让我一头雾水,因为main方法已经写出 ...
  • main file has non-main package or doesn't contain main function 报错的意思是说,找不到你写的包并没有main函数。 其实呢,package不是IDE自动弹出的包,而是跟go文件名一样的。 ...
  • main" java.lang.Error: 无法解析的编译问题解决思路public class ClientLogin extends JFrame { }因为没有导入包,要在头文件导入该包,然后才可调用import javax.swing.JFrame; //继承JFrame的所有功能 ...
  • AS运行main()方法报错:SourceSet with name ‘main’ not found 记录一下在AS上运行Java文件的main()方法时报错,报错如下: 解决方法:在.idea文件夹下的gradle.xml文件中添加<option name="delegatedBuild" ...
  • RuntimeError: main thread is not in main loop

    千次阅读 2019-05-15 16:26:06
    在使用tkinter 时,添加了一个线程来实现定时任务,虽然能够运行,但是出现了main thread is not in main loop 的错误,具体原因是tkinter包的问题, 安装改进版本的tkinter 即可,代码也不需要做修改 pip install ...
  • void main 与int main的区别

    千次阅读 2015-01-17 16:45:26
    void main 和 int main的区别就是有无返回值啊 在int main 可以出现非 int 类型的东西 我们在写代码时,一个函数要么有返回值,要么没有返回值,没有返回值就用void来表示。 main函数同样的,在没有返回值时加个void...
  • C语言main函数返回值详解

    万次阅读 2019-08-30 23:54:28
    前言:本文程序代码均在...C语言的main函数有两个标准写法 // C99加入两种 main 标准写法 int main(void) // 标准一写法 // 和 int main(int argc,char *argv[]) // 标准二写法 int main(int argc,char **argv) // ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,434,400
精华内容 573,760
关键字:

main