python中加入绝对路径_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并没有什么区别,上面说的好像并没有什么卵用:

目录结构:

1289816-20190103225910366-213164152.png

####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

无论是去掉还是加上都没有任何影响,程序依旧能正常运行,原因分析:

1289816-20190103230027141-162947592.png

我们运行task的时候是在程序的目录外面,也就是my_proj,而非tasks所在的目录,我们导入程序的代码到python解释器环境中运行,而非直接在程序目录运行,所以代码中的celery python解释器是到python的环境变量中去寻找,最终导入的是python程序目录中的celery而非my_proj程序目录中我们自己写的celery的模块,所以能正常运行。

如果我们直接在my_proj中去运行tasks程序是就会报错:

1289816-20190103230557445-124695595.png

这是因为程序调用了我们自己写的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']

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值