• 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--pythonweb1web2', 'E:9--pythonweb1', 'E:9--pythonweb1venvScriptspython36.zip', 'D:python3DLLs', 'D:python3lib', 'D:python3', 'E:9--pythonweb1venv', 'E:9--pythonweb1venvlibsite-packages', 'E:9--pythonweb1venvlibsite-packagessetuptools-28.8.0-py3.6.egg', 'E:9--pythonweb1venvlibsite-packagespip-9.0.1-py3.6.egg', 'D:PyCharm 2017.3.4helperspycharm_matplotlib_backend']

    #在cmd中执行

    #######

    ['E:9--pythonweb1web2', 'D:python3python36.zip', 'D:python3DLLs','D:python3lib', 'D:python3', 'D:python3libsite-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__':
        逻辑代码

    转自:
    python的__file__和__name__变量
    https://www.cnblogs.com/jianbonet/p/8663040.html

  • 相关阅读:
    自动滑块验证登录QQ-java实现
    今日校园自动提交问卷-Java实现
    文库下载实现自动化
    测试
    软件工程结课小结
    结对项目-java生成四则运算
    JS判断对象为空的三种方法
    vue 组件间 8 大通讯方式 之三 eventBus
    vue 组件间 8 大通讯方式 之二 provide/ inject ref / refs
    vue 组件间 8 大通讯方式 之一 props / $emit $children / $parent
  • 原文地址:https://www.cnblogs.com/jyfootprint/p/9429346.html
Copyright © 2020-2023  润新知