#現在的目錄結構為
#現在想要在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