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--python\web1

#现在在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
python的__file__和__name__变量的更多相关文章
- python __name__ 变量的含义
python __name__ 变量的含义 if __name__ == '__main__': tf.app.run() 当python读入程序时,会初始化一些系统变量.如果当前程序是主程序,__n ...
- (转)Python学习笔记(1)__name__变量
Python使用缩进对齐组织代码的执行,所有没有缩进的代码,都会在载入时自动执行.每个文件(模块)都可以任意写一些没有缩进的代码,并在载入时自动执行.为了区分 主执行代码和被调用文件,Python引入 ...
- __file__、__name__、__dict__方法整理
本文主要介绍__file__.__name__.__dict__三个方法的作用. #01 __file__:打印当前文件的位置. # import os # print(__file__) # 在py ...
- 扫盲贴000---关于python中的if __name__ == '__main__'
对于python中的__name__变量,根据调用python文件的方式不同,__name__变量的值也会不同.假如我有一个名为hello_world.py的python脚本,当我的目的是直接运行这个 ...
- python解释器遇到if __name__=="__main__"会如何做?
python解释器遇到if __name__=="__main__"会如何做 # Threading example import time, thread def myfunct ...
- Python中的if __name__ == '__main__'
如何简单地理解Python中的if __name__ == '__main__' 1. 摘要 通俗的理解__name__ == '__main__':假如你叫小明.py,在朋友眼中,你是小明(__ ...
- Python 3 学习笔记之——变量作用域、模块和包
1. 变量作用域 Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的.变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称.Python 的作用域一共 ...
- 如何理解python中的if __name__=='main'的作用
一. 一个浅显易懂的比喻 我们在学习python编程时,不可避免的会遇到if __name__=='main'这样的语句,它到底有什么作用呢? <如何简单地理解Python中的if __name ...
- python两个类之间变量和函数的调用
1.class_a() class_b() 2.class_b使用class_a中的变量和函数 3.变量class_a中:class_a.num=... 函数class_b中:先实例化class_a( ...
随机推荐
- js排他功能示例
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- mysql数据分组
创建分组 分组是在SELECT语句中的GROUP BY 子句中建立的. 例: SELECT vend_id, COUNT(*) AS num_prods FROM products GROUP BY ...
- jq-demo-日历
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- yum 安装pip
centos7 没有python-pip包就执行命令 yum -y install epel-release 执行成功之后,再次执行yum install python-pip 对安装好的pip进行升 ...
- Java之Java的文件结构(才不是叛教!)
Java从入门到恰饭之文件结构,使用IDEA开发. 新建包 包名一般选择公司域名(https://tieba.baidu.com/)的反转 创建完成是这样的 对应的三层文件夹 我们创建一个类 pack ...
- jQuery - DOM相关
1. 操作文本 console.log($("#t1").html()); // 获取span元素中的内容, 包含html标签 $("#t1").html(&q ...
- Kotlin -help
{ kotlin: run Kotlin programs, scripts or REPL. Usage: kotlin <options> <command> <ar ...
- MTT学习小记
这是个毒瘤题才有的毒瘤东西--奶一口NOI不考 拆系数FFT: 考虑做NTT时模数不是NTT模数(\(2^a*b+1\))怎么办? 很容易想到拆次数FFT. 比如说现在求\(a*b\),设\(m=\s ...
- bzoj1016题解
[解题思路] Kruskal的拓展. 可以先对边排序,进行一次Kruskal,判断是否可行,并计算出每种权值的边需要多少条. 然后暴力统计每种权值可行的方案数,根据乘法原理乘起来即可.复杂度o(210 ...
- 内置Jetty配置JSP支持过程中的常见报错
目录 1. 常见报错及解决 1.1 JSP support not configured 1.2 JSTL标签解析 1.3 JSP编译 1.4 JSP实现依赖 1.5 EL表达式支持 2. 小结 1. ...