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

#现在的目录结构为

 #现在想要在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__':
    逻辑代码

猜你喜欢

转载自www.cnblogs.com/jyfootprint/p/9429346.html