专栏首页python3python3绝对路径,相对路径

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']

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python的文件类型、python的变量

    1、源码文件:用.py结尾,有python解释器,不需要编译 2、字节码文件:python 源码文件经编译后生成的扩展名为 .pyc 的二进制文件 源码文件 [...

    py3study
  • python note

    1.新建一个项目 django-admin.py startproject project_name 2.新建一个APP python manage.py st...

    py3study
  • python之基础篇(一)

    python是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum于1989年发明,第一个公开发行版发行于1991年。

    py3study
  • Python微信后台开发--环境搭建与接入指南

    0x00 背景及介绍 申请一个微信公众平台订阅号,将后台接入到服务器上,验证服务器地址的有效性,实现简单的业务逻辑,根据用户发送不同类型的消息做出不同的反应。 ...

    小小科
  • day5、文件乱码怎么解决

    1.1 Linux下,如何将一个乱码的文件进行重命名 方法一: 命令格式:mv $(ls   |egrep "[^a-zA-Z0-9.-]") tandao.t...

    863987322
  • IIS 部署 Python Django

    知道的,百度上搜出来的东西质量令人唏嘘。当你求助的时候多半还得靠自己,或者靠Google

    py3study
  • SC2018 | 中国揭秘下一代超算,清华摘得竞赛总冠军

    全球超级计算大会(Supercomputing Conference,简称 SC)是国际超算领域的顶级会议,国际影响力巨大。在这次大会上,清华大学的团队还获得了...

    机器之心
  • SAP作业类型应用介绍

    举一个简单实例,生产某产品FG01需要水电和人工,特别是工资需要月末实际发放时才能确定,这不符合成本管理的事先预算事中控制的原则,于是SAP提供这样的解决思路 ...

    用户5495712
  • 挖洞经验|看我如何挖到了一个价值5K刀的谷歌“404页面”

    大家别慌,这是一篇很短的文章…文章虽短,但希望能给大家日常挖洞带来灵感或启发! 在今年一月份的某一天,作为一个非常喜欢搞事情的人,当时的我正在尝试寻找Googl...

    FB客服
  • 让IE的地址栏在弹出窗口也显示

    相信web开发人员经常使用到浏览器的地址栏,通过跟踪页面的地址来查看页面的源代码。

    williamwong

扫码关注云+社区

领取腾讯云代金券