zoukankan      html  css  js  c++  java
  • python的__file__和__name__变量

    #现在的目录结构为

     #现在想要在web2/bin.py中调用web3/main.py模块中的方法

    from web3 import main
    main.foo()
    
    #在pycharm中执行
    ########
    ok
    
    #在cmd中执行
    ########
    ModuleNotFoundError: No module named 'web3'

    #发现在pycharm中执行与在cmd中执行的结果不同(在cmd中找不到项目目录web1的路径),这是因为pycharm会自动将项目的中路径写入环境变量python中

    import sys
    print(sys.path)
    
    #在pycharm中执行
    #######
    ['E:\9--python\web1\web2', 'E:\9--python\web1', 'E:\9--python\web1\venv\Scripts\python36.zip', 'D:\python3\DLLs', 'D:\python3\lib', 'D:\python3', 'E:\9--python\web1\venv', 'E:\9--python\web1\venv\lib\site-packages', 'E:\9--python\web1\venv\lib\site-packages\setuptools-28.8.0-py3.6.egg', 'E:\9--python\web1\venv\lib\site-packages\pip-9.0.1-py3.6.egg', 'D:\PyCharm 2017.3.4\helpers\pycharm_matplotlib_backend']
    
    #在cmd中执行
    ########
    ['E:\9--python\web1\web2', 'D:\python3\python36.zip', 'D:\python3\DLLs','D:\python3\lib', 'D:\python3', 'D:\python3\lib\site-packages']

    #所以如果想要使得在任何环境下代码都可执行的话,只需手动将项目的路径导入环境变量path中即可,这就需要用到__file__了

    #变量__file__表示文件本身,输出的是一个绝对路径(但在pycharm中会自动输出绝对路径),所以需要将其转换成绝对路径

    print(__file__)
    
    #在pycharm中执行
    ########
    E:/9--python/python_project/web1/web2/bin.py
    
    #在cmd中执行
    ########
    bin.py
    import sys
    import os
    DIR_NAME=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    print(DIR_NAME)
    sys.path.append(DIR_NAME)
    
    ########
    E:9--pythonweb1

    #现在在cmd中先要从web2/bin.py再调用web3/main.py的方法就可实现了

    #所以在pycharm中编程,需要注意其所作的一些优雅操作,防止代码在别的环境下无法执行

    #在编程过程中,免不了测试环节,所以现在在web3/main.py中想要测试foo()函数是否能否执行,那么就要在其中调用。但如果现在从web2/bin.py中import模块main.py时,测试所用的foo()方法就会被执行

    #在web3/main.py中
    def foo():
        print('ok')
    foo()
    
    ########
    ok
    #在web2/bin.py中
    from web3 import main
    main.foo()
    
    ########
    ok
    ok

    #所以如果想要解决这个问题,就需要__name__变量,现在看看__name__变量在脚本本身执行和在被调用执行的区别

    #在web3/main.py中
    def bar():
        print(__name__)
    bar()
    
    ######## 
    __main__
    #在web2/bin.py中
    from web3 import main
    main.bar()
    
    ########
    web3.main
    web3.main

    #发现在脚本本身执行的话其输出为__main__,在被调用时执行则输出原脚本的名字

    #所以可以在脚本的逻辑代码前加一句判断,使得被调用是不会执行原脚本的逻辑代码,只允许调用方法

    if __name__ == '__main__':
        逻辑代码
  • 相关阅读:
    83. Remove Duplicates from Sorted List
    35. Search Insert Position
    96. Unique Binary Search Trees
    94. Binary Tree Inorder Traversal
    117. Populating Next Right Pointers in Each Node II
    116. Populating Next Right Pointers in Each Node
    111. Minimum Depth of Binary Tree
    169. Majority Element
    171. Excel Sheet Column Number
    190. Reverse Bits
  • 原文地址:https://www.cnblogs.com/jianbonet/p/8663040.html
Copyright © 2011-2022 走看看