python的__file__和__name__變量

#如今的目錄結構爲python

 #如今想要在web2/bin.py中調用web3/main.py模塊中的方法web

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__了app

#變量__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中編程,須要注意其所做的一些優雅操做,防止代碼在別的環境下沒法執行spa

 

#在編程過程當中,免不了測試環節,因此如今在web3/main.py中想要測試foo()函數是否可否執行,那麼就要在其中調用。但若是如今從web2/bin.py中import模塊main.py時,測試所用的foo()方法就會被執行code

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

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

########
ok
ok

#因此若是想要解決這個問題,就須要__name__變量,如今看看__name__變量在腳本自己執行和在被調用執行的區別blog

#在web3/main.py中
def bar():
    print(__name__)
bar()

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

########
web3.main
web3.main

#發如今腳本自己執行的話其輸出爲__main__,在被調用時執行則輸出原腳本的名字ip

#因此能夠在腳本的邏輯代碼前加一句判斷,使得被調用是不會執行原腳本的邏輯代碼,只容許調用方法

if __name__ == '__main__':
    邏輯代碼
相關文章
相關標籤/搜索