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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM