python3絕對路徑,相對路徑


from __future__ import absolute_import的作用: 

直觀地看就是說”加入絕對引入這個新特性”。說到絕對引入,當然就會想到相對引入。那么什么是相對引入呢?比如說,你的包結構是這樣的:
pkg/
pkg/init.py
pkg/main.py
pkg/string.py

如果你在main.py中寫import string,那么在Python 2.4或之前, Python會先查找當前目錄下有沒有string.py, 若找到了,則引入該模塊,然后你在main.py中可以直接用string了。如果你是真的想用同目錄下的string.py那就好,但是如果你是想用系統自帶的標准string.py呢?那其實沒有什么好的簡潔的方式可以忽略掉同目錄的string.py而引入系統自帶的標准string.py。這時候你就需要from __future__ import absolute_import了。這樣,你就可以用import string來引入系統的標准string.py, 而用from pkg import string來引入當前目錄下的string.py了
---------------------
但是經過實驗,去掉跟加上from __future__ import absolute_import並沒有什么區別,上面說的好像並沒有什么卵用:

目錄結構:

 

####celery.py

from celery import Celery

app = Celery('proj',
broker='redis://localhost',
backend='redis://localhost',
include=['my_proj.tasks'])

# Optional configuration, see the application user guide.
app.conf.update(
result_expires=3600,
)

if __name__ == '__main__':
app.start()

 

##tasks.py
#from __future__ import absolute_import, unicode_literals
from .celery import app
@app.task
def showtime():
import datetime
print('show time------')
return datetime.datetime.now()
@app.task
def add(x,y):
print('sum-------- x , y')
return x+y

無論是去掉還是加上都沒有任何影響,程序依舊能正常運行,原因分析:

 

我們運行task的時候是在程序的目錄外面,也就是my_proj,而非tasks所在的目錄,我們導入程序的代碼到python解釋器環境中運行,而非直接在程序目錄運行,所以代碼中的celery  python解釋器是到python的環境變量中去尋找,最終導入的是python程序目錄中的celery而非my_proj程序目錄中我們自己寫的celery的模塊,所以能正常運行。

如果我們直接在my_proj中去運行tasks程序是就會報錯:

這是因為程序調用了我們自己寫的celery.py模塊,而我們自己的模塊中沒有 celery.Celery,所以就報錯了。。。

 

總結:以后我們自己的模塊最好不要給系統軟件包或模塊同名,或則會出現蛋疼的問題,如果實在要同名要注意用絕對路徑導入from xxxx.xxx import xxx,不然會出現莫名奇妙的問題,如果直接import xxx,默認會從當前路徑導入,當前路徑無法找到就會從sys.path中去尋找,如果不能找到我們的程序模塊,可以在sys.path中加上我們模塊的路徑。

 

pycharm會自動將項目根路徑加到sys.path

print(sys.path)

['C:\\Users\\dufeixiang\\PycharmProjects\\celery\\my_proj\\fuck', 'C:\\Users\\dufeixiang\\PycharmProjects\\celery', 'C:\\python\\python36.zip', 'C:\\python\\DLLs', 'C:\\python\\lib', 'C:\\python', 'C:\\python\\lib\\site-packages', 'C:\\python\\lib\\site-packages\\pip-18.0-py3.6.egg', 'C:\\python\\lib\\site-packages\\win32', 'C:\\python\\lib\\site-packages\\win32\\lib', 'C:\\python\\lib\\site-packages\\Pythonwin']

python中當前執行模塊所在目錄會自動加入到os.path,所以我們導入模塊時會默認先到當前目錄尋找

['/root/test/celery/my_proj', '/usr/lib64/python34.zip', '/usr/lib64/python3.4', '/usr/lib64/python3.4/plat-linux', '/usr/lib64/python3.4/lib-dynload', '/usr/lib64/python3.4/site-packages', '/usr/lib/python3.4/site-packages', '/usr/lib/python3.4/site-packages/setuptools-40.6.3-py3.4.egg', '/usr/lib/python3.4/site-packages/pip-18.1-py3.4.egg']

 


免責聲明!

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



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