#如今的目錄結構爲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__': 邏輯代碼