#现在的目录结构为

#现在想要在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__变量的更多相关文章

  1. python __name__ 变量的含义

    python __name__ 变量的含义 if __name__ == '__main__': tf.app.run() 当python读入程序时,会初始化一些系统变量.如果当前程序是主程序,__n ...

  2. (转)Python学习笔记(1)__name__变量

    Python使用缩进对齐组织代码的执行,所有没有缩进的代码,都会在载入时自动执行.每个文件(模块)都可以任意写一些没有缩进的代码,并在载入时自动执行.为了区分 主执行代码和被调用文件,Python引入 ...

  3. __file__、__name__、__dict__方法整理

    本文主要介绍__file__.__name__.__dict__三个方法的作用. #01 __file__:打印当前文件的位置. # import os # print(__file__) # 在py ...

  4. 扫盲贴000---关于python中的if __name__ == '__main__'

    对于python中的__name__变量,根据调用python文件的方式不同,__name__变量的值也会不同.假如我有一个名为hello_world.py的python脚本,当我的目的是直接运行这个 ...

  5. python解释器遇到if __name__=="__main__"会如何做?

    python解释器遇到if __name__=="__main__"会如何做 # Threading example import time, thread def myfunct ...

  6. Python中的if __name__ == '__main__'

    如何简单地理解Python中的if __name__ == '__main__'   1. 摘要 通俗的理解__name__ == '__main__':假如你叫小明.py,在朋友眼中,你是小明(__ ...

  7. Python 3 学习笔记之——变量作用域、模块和包

    1. 变量作用域 Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的.变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称.Python 的作用域一共 ...

  8. 如何理解python中的if __name__=='main'的作用

    一. 一个浅显易懂的比喻 我们在学习python编程时,不可避免的会遇到if __name__=='main'这样的语句,它到底有什么作用呢? <如何简单地理解Python中的if __name ...

  9. python两个类之间变量和函数的调用

    1.class_a() class_b() 2.class_b使用class_a中的变量和函数 3.变量class_a中:class_a.num=... 函数class_b中:先实例化class_a( ...

随机推荐

  1. JVM配置参数理解,Cannot load this JVM TI agent twice

    基本参数 -Xms128m JVM初始分配的堆内存 -Xmx512m JVM最大允许分配的堆内存,按需分配 -XX:PermSize=64M JVM初始分配的非堆内存 -XX:MaxPermSize= ...

  2. 【JZOJ6403】a

    description analysis 考虑\((0,0,0)\)走到某个点\((i,j,k)\)的贡献,相当于插板问题 \(i+j\)个空插\(k\)个板可以有空,\(i\)个空插\(j\)个板可 ...

  3. JAVA java

    { 用法: java [-options] class [args...]           (执行类)   或  java [-options] -jar jarfile [args...]    ...

  4. css内容超出显示省略号

    CSS实现单行.溢出显示省略号(…) 把要设置的显示省略号的标签,加上以下的属性 overflow: hidden; /*超出不显示*/ text-overflow: ellipsis;/* 超出内容 ...

  5. thinkphp 查询缓存

    对于及时性要求不高的数据查询,我们可以使用查询缓存功能来提高性能,而且无需自己使用缓存方法进行缓存和获取. 大理石平台价格 查询缓存功能支持所有的数据库,并且支持所有的缓存方式和有效期. 在使用查询缓 ...

  6. 线段树区间离散化——牛客多校E

    这个区间离散化把我调死了.. 总之用vector来离散化,然后叶子节点维护的是一段区间,记录下每个叶子结点的起点+长度 千万要注意下标不能弄错! #include<bits/stdc++.h&g ...

  7. Delphi提取EXE,DLL文件图标

    //uses ShellAPIprocedure TForm1.Button1Click(Sender: TObject);var IconIndex:Word; h:hICON;begin Icon ...

  8. 暑假集训test-8-31(am)

    1.字符串匹配 看到题目以为真是字符串题结果是数学题..70分做法很傻逼然而我更傻逼只有30... 正解是发现两个位置会匹配当且仅当mod gcd(lena,lenb)同余,在一个lcm(lena,l ...

  9. NX二次开发-UF_OBJ_cycle_by_name遍历名字

    使用前自己要看好名字是加在body,还是face,还是curve,或者其他,别加错了. NX9+VS2012 #include <uf.h> #include <uf_obj.h&g ...

  10. 利用NHibernate与MySQL数据库交互

    本文章使用Visual Studio作为开发工具,并建立在已经安装MySQL数据库的前提. NHibernate是一个面向.NET环境的对象/关系数据库映射工具.官网:http://nhibernat ...