python 相对路径引用,python绝对路径导入模块

  python 相对路径引用,python绝对路径导入模块

  python的好处是不需要知道很多概念,所以会有工作的机会,同样的问题随时会发生。下面这篇文章主要介绍Python包的导入,相对路径,绝对路径。有需要的可以参考一下。

  00-1010一.包装二进口包裹.导入3。__init__。py文件4.from包。模块导入。相对和绝对进口包1。绝对进口2。相对进口4。导入自定义包5的子模块。单独进口包装6。软件包安装和

  

目录

  我们的项目中可能有太多的模块。

  但是我们不能把所有的模块都这样放在这里,这样项目会很乱。

  我们可以把所有同类型的模块放在一个文件夹里,这个文件夹叫做包。

  包是一个文件夹,用于存储文件,即模块。包也可以存储在包中。

  包是包含__init__的文件夹。py文件。

  包只是模块的一种形式,包就是模块。

  包的结构:

  包

   - _ _ init _ _。py包标志文件

  -模块1

  -模块2

  -子包(文件夹)

   - - __init__。巴拉圭

  - -子模块1

  --子模块2

  

一、包

  1.与包相关的导入语句也分为import和from.进口.但是不管是哪一个,不管在哪里,进口的时候都要遵循一个原则:进口的时候带点的东西,必须是左边一个包,否则就是非法的。你可以有一系列的点,比如demo0demo02.demo03,但是一定要遵循这个原则。

  2.导入后,使用时就没有这种限制了。点的左边可以是包,模块,函数,类(都可以用点的方式调用自己的属性)。

  3.比较import demo和from demo导入名称的应用场景:

  如果我们想直接使用名称,我们必须使用后者。

  

二、包的导入

  在demo01 _ test02.py中导入demo01_test01.py。

  Demo01_test01.py源代码:

  def say():

  打印( demo01_test01_hello )

  Name=赵四

  Demo01_test02.py源代码:

  导入base.demo01.demo01_test01

  base . demo 01 . demo 01 _ test01 . say()#调用test 01中的say方法输出demo01_test01_hello

  导入系统

  打印(系统路径)

  #[ d : \ \ py charm workspace \ \ day 12 \ \ base \ \ demo 01 , d : \ \ py charm workspace \ \ day 12 , c 3360 \ \ Users \ \ Administrator \ \ AppData \ Python 36 . zip , c : \ \ Users \ \ Administrator \ \ AppData \ \ Local \ \ Programs \ \ Python \ \ Python 36 \ \ dll , c : \ \ Users \ \ Administrator \ \ AppData \ \ Local \ \ Programs \ \ Python 36 \ \ Python 36 \ \ lib , c 3: \ \ Users \ \ AppData \ \ Local \ \ Local \ \ Pr

  ograms\\Python\\Python36, C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\lib\\site-packages, C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\lib\\site-packages\\win32, C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\lib\\site-packages\\win32\\lib, C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\lib\\site-packages\\Pythonwin, C:\\Program Files\\JetBrains\\PyCharm 2018.3.2\\helpers\\pycharm_matplotlib_backend]

  

  

2.from...import...导入

  from 包名.模块名... import 变量名

  使用方式: 例如 变量名() 或者print(变量名)

  demo01_test02.py 源码:

  

from base.demo01.demo01_test01 import say

  say() # demo01_test01_hello

  from 包名.模块名... import 变量名1,变量名2,...

  使用方式: 例如 变量名1() 或者print(变量名2)

  demo01_test02.py 源码:

  

from base.demo01.demo01_test01 import say,name

  say()

  print(name) # 调用test01中的name变量

  from 包名 import 模块名

  使用方式:模块名.变量名() 或者 print(模块名.变量名)

  demo01_test02.py 源码:

  

from base.demo01 import demo01_test01

  demo01_test01.say() # demo01_test01_hello

  from 包名 import 模块名,模块名1...

  使用方式:模块名.变量名() 或者 print(模块名1.变量名)

  在demo01_test02.py中调用demo02_test01.py,demo02_test02.py 源码

  demo02_test01.py 源码:

  

def say21():

   print(demo02_test01_hello)

  demo02_test02.py 源码:

  

def say22():

   print(demo02_test02_hello)

  demo01_test02.py 源码:

  

from base.demo02 import demo02_test01,demo02_test02

  demo02_test01.say21() # demo02_test01_hello

  demo02_test02.say22() # demo02_test02_hello

  需要注意的是from后import导入的模块,必须是明确的一个不能带点,否则会有语法错误,如:from a import b.c是错误语法

  

from base.demo02 import demo02_test02.say

  # 报错 SyntaxError: invalid syntax

  

  

3.__init__.py文件

  不管是哪种方式,只要是第一次导入包或者是包的任何其他部分,都会依次执行包下的__init__.py文件(我们可以在每个包的文件内都打印一行内容来验证一下),这个文件可以为空,但是也可以存放一些初始化包的代码。

  demo1下的__init__.py文件源码:

  

print(啦啦啦)

  demo01_test02.py 源码:

  

from base.demo01 import demo01_test01

  demo01_test01.say()

  # 啦啦啦 __init__.py中的代码执行结果

  # demo01_test01_hello

  

  

4.from 包.模块 import *

  此处是想从包demo02中导入所有,实际上该语句只会导入包demo02下__init__.py文件中定义的名字,我们可以在这个文件中定义__all___:

  demo02下__init__.py文件的源码:

  

print(呜呜呜)

  name = 王大夫

  demo01_test02.py 源码:

  

from base.demo02 import *

  print(name) # 王大夫

  demo02_test01.say() # 报错 无法调用

  # 输出: 呜呜呜

  # NameError: name demo02_test01 is not defined

  在demo02下的__init__.py文件中加入以下源码:

  

print(呜呜呜)

  name = 王大夫

  __all__ = [demo02_test01,demo02_test02]

  再调用:

  

from base.demo02 import *

  demo02_test01.say21() # 成功调用

  print(name) # 报错 变量name没有定义

   # 呜呜呜

   # demo02_test01_hello

  

  

三、包的相对和绝对导入

  我们的最顶级包base是写给别人用的,然后在base包内部也会有彼此之间互相导入的需求,这时候就有绝对导入和相对导入两种方式:

  绝对导入:以base作为起始

  相对导入:用.或者..的方式最为起始(只能在一个包中使用,不能用于不同目录内)

  

  

1. 绝对导入

  在demo01中的demo01_test02.py中调用demo02中的模块

  

from base.demo01 import demo01_test01

  demo01_test01.say()

  在 base目录下的py文件中调用demo01_test02.py

  

from base.demo01 import demo01_test02

  demo01_test02.demo01_test01.say()

  

  

2.相对导入

  在demo01中的demo01_test02.py中调用demo02中的模块

  

from ..demo02.demo02_test01 import say21

  say21()

  在 base目录下的py文件中调用demo01_test02.py

  

from base.demo01 import demo01_test02

  demo01_test02.say21()

  import sys

  print(sys.path)

  啦啦啦

  呜呜呜

  demo02_test01_hello

  demo02_test01_hello

  [D:\\pycharm工作空间\\day12\\base, D:\\pycharm工作空间\\day12, C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\python36.zip, C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\DLLs, C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\lib, C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36, C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\lib\\site-packages, C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\lib\\site-packages\\win32, C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\lib\\site-packages\\win32\\lib, C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\lib\\site-packages\\Pythonwin, C:\\Program Files\\JetBrains\\PyCharm 2018.3.2\\helpers\\pycharm_matplotlib_backend]

  

  相对路径运行注意事项:

  在没有明确指定包结构的情况下,Python 是根据 __name__ 来决定一个模块在包中的结构的,如果是 __main__ 则它本身是顶层模块,没有包结构,如果是base.demo01.demo02 结构,那么顶层模块是 base。

  如果是相对导入,一个模块必须有包结构且只能导入它的顶层模块内部的模块

  如果一个模块被直接运行,则它自己为顶层模块,不存在层次结构,所以找不到其他的相对路径。

  

  

  

四、import 导入自定义包的子模块

  特别需要注意的是:可以用import导入内置或者第三方模块(已经在sys.path中),但是要绝对避免使用import来导入自定义包的子模块(没有在sys.path中),应该使用from... import ...的绝对或者相对导入

  demo03中的test01源码:

  

def test():

   print(这是一个测试方法)

  直接运行demo03_test02模块

  

import test01

  test01.test()

  import sys

  print(sys.path)

  这是一个测试方法

  [D:\\pycharm工作空间\\day12\\base\\demo03, D:\\pycharm工作空间\\day12, D:\\pycharm工作空间\\day12\\base\\demo03, C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\python36.zip, C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\DLLs, C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\lib, C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36, C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\lib\\site-packages, C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\lib\\site-packages\\win32, C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\lib\\site-packages\\win32\\lib, C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\lib\\site-packages\\Pythonwin, C:\\Program Files\\JetBrains\\PyCharm 2018.3.2\\helpers\\pycharm_matplotlib_backend]

  

  不会报错因为sys.path中已经添加了day05-包/demo03路径。Import会从sys.path中依次搜索路径。

  在base目录下导入demo03_test02.py进行使用

  

from base.demo03 import test02

  # 报错 ModuleNotFoundError: No module named test01

  因为此时的sys.path中只有demo01-包.py的路径 .../day05-包,import demo03_test01 只能从/day05-包下查找 demo03_test01模块。找不到因此报错。

  解决import 导入包时的报错问题

  我们可以在sys.path中添加import搜索的路径。

  

import sys,os

  path = os.path.abspath(__file__)

  print(path)

  BASE_DIR = os.path.dirname(os.path.abspath(__file__))

  print(BASE_DIR)

  sys.path.append(BASE_DIR)

  print(sys.path)

  import base.demo03.test01

  base.demo03.test01.test() # 这是一个测试方法

  

  

五、包的单独导入

  单独导入包名称时不会导入包中所有包含的所有子模块

  

import base.demo03

  base.demo03.test01.test()

  # 报错 AttributeError: module base.demo03 has no attribute test01

  解决办法:需要从__init__.py中进行初始化操作

  

  进行上诉操作后:

  

  

  

六、包的安装和发布

  1、在包的同级目录创建 setup.py

  

from distutils.core import setup

  setup(name=bag,

   version=1.0,3,

   description=描述:这是我的第一个包,

   author=zxb,

   author_email=505555162@qq.com,

   py_modules=[test1, test2],

   )

  2.在命令行 运行 python setup.py build (可以不执行 )

  构建模块

  

  

  

  4.生成发布的压缩包 运行 python setup.py sdist

  

  

  

  5、安装包

  

  

  

  导入自己的包进行测试

  

  测试成功!!

  包的卸载: 直接找到对应的位置删除即可。

  

  

  

总结

  到此这篇关于python包相关知识点之包的导入、相对路径以及绝对路径的文章就介绍到这了,更多相关python包的导入、相对及绝对路径内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: