番外:跨目录导入模块

进击のpython


包&跨模块代码调用


  • 包(Package)

    当你的模块文件越来越多,就需要对模块文件进行划分,比如把负责跟数据库交互的都放一个文件夹,把与页面交互相关的放一个文件夹,

    my_proj/
    ├── apeland_web  #代码目录
    │   ├── __init__.py
    │   ├── admin.py
    │   ├── apps.py
    │   ├── models.py
    │   ├── tests.py
    │   └── views.py
    ├── manage.py
    └── my_proj    #配置文件目录
        ├── __init__.py
        ├── settings.py
        ├── urls.py
        └── wsgi.py

    像上面这样,一个文件夹管理多个模块文件,这个文件夹就被称为包

    一个包就是一个文件夹,但该文件夹下必须存在 __init__.py文件, 该文件的内容可以为空, __init__.py用于标识当前文件夹是一个包。

    这个 __init__.py的文件主要是用来对包进行一些初始化的,当当前这个package被别的程序调用时 __init__.py文件会先执行,一般为空, 一些你希望只要package被调用就立刻执行的代码可以放在 __init__.py里,一会后面会演示。


  • 跨模块导入

    目录结构如下

    my_proj
    ├── apeland_web
    │   ├── __init__.py
    │   ├── admin.py
    │   ├── apps.py
    │   ├── models.py
    │   ├── tests.py
    │   └── views.py
    ├── manage.py
    └── my_proj
        ├── settings.py
        ├── urls.py
        └── wsgi.py

    根据上面的结构,我怎么样可以在apeland_web/views.py里导入my_proj/settings.py模块呢?

    直接导入????

    是会报错的,因为这两个模块,不在同一路径,所以找不到这个settings模块

    my_proj/settings.py 相当于是apeland_web/views.py的父亲(apeland_web)的兄弟(my_proj)的儿子(settings.py),settings.py算是views.py的表弟啦

    在views.py里只能导入同级别兄弟模块代码,或者子级别包里的模块,根本不知道表弟表哥的存在。这可怎么办呢?

    添加环境变量,把父亲级的路径添加到sys.path中,就可以了,这样导入就相当于从父亲级开始找模块了。

    (标红是因为解释器的问题,不用管!强迫症去死!)

    那么问题来了!

    这是我的电脑,这是我的文件存放路径

    那到你电脑上,还是D盘????那不一定吧

    那怎么才能自动配置呢???

    还记得我们的os模块吗?

    是不是说用哪个记哪个?

    现在开始了奥!

    这个方法,可以获取当前文件的相对路径

    但是为什么打印的是绝对路径呢?

    这是因为pycharm是从底层开始调用的,所以没有打印相对路径

    正常是相对路径:my_proj1/apeland_web/views.py

    然后我们只想要前面的my_proj1

    怎么做呢??????????

    利用os模块

    import sys
    import os
    
    # base = "D:/xiangmu/my_proj1"
    
    # sys.path.append(base)
    
    # from my_proj import settings
    
    s = __file__
    # my_proj1/apeland_web/views.py
    
    print(os.path.dirname(s))
    # my_proj1/apeland_web

    去掉了一层!但是我只想要my_proj1,怎么办??

    再来一遍呗!

    import sys
    import os
    
    # base = "D:/xiangmu/my_proj1"
    
    # sys.path.append(base)
    
    # from my_proj import settings
    
    s = __file__
    # my_proj1/apeland_web/views.py
    
    print(os.path.dirname(s))
    # my_proj1/apeland_web
    print(os.path.dirname(os.path.dirname(s)))
    # my_proj1

    目的达到了吧!那我们怎么把它变成绝对路径呢???

    import sys
    import os
    
    base = r"D:\xiangmu\my_proj1"
    
    sys.path.append(base)
    
    from my_proj import settings
    
    s = __file__
    # my_proj1/apeland_web/views.py
    
    print(os.path.dirname(s))
    # my_proj1/apeland_web
    print(os.path.dirname(os.path.dirname(s)))
    # my_proj1
    print(os.path.abspath(os.path.dirname(os.path.dirname(s))))
    # D:\xiangmu\my_proj1

    这样,因为你用的是动态的路径拼接,所以,即使放到你的电脑上

    这段程序也是能够使用的!


  • 官方推荐的跨目录导入方法

    虽然通过添加环境变量的方式可以实现跨模块导入

    但是官方不推荐这么干

    因为这样就需要在每个目录下的每个程序里都写一遍添加环境变量的代码

    官方推荐的玩法是,在项目里创建个入口程序,整个程序调用的开始应该是从入口程序发起,这个入口程序一般放在项目的顶级目录

    这样做的好处是,项目中的二级目录 apeland_web/views.py中再调用他表亲my_proj/settings.py时就不用再添加环境变量了

    原因是由于manage.py在顶层,manage.py启动时项目的环境变量路径就会自动变成….xxx/my_proj/这一级别

    这样,就十分的简单啦!

    主要就是因为当你程序执行的时候

    就默认以你程序执行文件的位置作为起点

    所以才可以这么玩!


*这个很重要*
*必须仔细瞧*

番外:跨目录导入模块

原文地址:https://www.cnblogs.com/jevious/p/11180270.html

时间: 2024-11-12 21:31:52

番外:跨目录导入模块的相关文章

跨目录导入模块

示例目录结构: 在sz.py文件中导入conf及core目录中的模块 1. 通过os模块获取文件所在的绝对路径 2. 获取文件的父级目录的绝对路径 3. 通过sys模块将获取到的绝对路径加入到环境变量中 4. 导入模块 import os,sys print(os.path.abspath(__file__)) #D:\PycharmProjects\second\day1\sz_app\bin\sz.py BASE_DIR = os.path.dirname(os.path.dirname(o

Python 跨目录导入文件问题

普通文件夹与包的区别: 普通文件夹下没有__init__.py文件,而包下面是有一个__init__.py文件的 普通文件夹(Directory) 因为此时test文件下下没有__init__.py文件,所以只是一个普通的文件夹,普通的文件夹是不能作为一个模块导入的 包(Python Package) 新建一个包之后,会自动生成一个__init__.py文件 原文地址:https://www.cnblogs.com/jasmine0627/p/10237803.html

Python入门--番外--中文目录乱码问题

写Python的程序,读取含有中文目录下的文件,结果发现根本读取不了该中文目录下的文件, 原因:通过调试发现:该文件的目录乱码,目录无法解析,自然导致无法读取文件内容 解决方法: strPath = "E:\superBoard\pro_input\1.8有理数的减法\1.8有理数的减法.htm" #这里的strpath是你的中文路径名 strPath = unicode(strPath , "GB2312") 此时得到的中文路径就不会乱码了

[转]python3 跨目录模块调用,你真的懂了吗?

小伙伴们,你们有遇到过调用自己写的模块(跨目录模块调用),提示你ImportError:No module named ...的情况,如果有,而且到现在还没有搞明白的,我想说,你今天看对文章了. 这篇文章主要是讲解怎么还原一个出错的场景,然后分析出错原因,一步一步的解决这个问题的思路. 项目结构 代码内容 # model1/student.py def get_name(): return "hting" # model1/new_student.py from student imp

python导入不同目录下模块的方法

下面将具体介绍几种常用情况:(1)主程序与模块程序在同一目录下:如下面程序结构:`-- src    |-- mod1.py    `-- test1.py    若在程序test1.py中导入模块mod1, 则直接使用import mod1或from mod1 import *; (2)主程序所在目录是模块所在目录的父(或祖辈)目录如下面程序结构:`-- src    |-- mod1.py    |-- mod2    |   `-- mod2.py    `-- test1.py    若

Linux入门之内核管理番外篇(4)udev入门(1)

Linux入门之内核管理番外篇(4)udev入门(1) 前言 在上篇中的内核模块管理讲解中,最后或多或少会留下一些疑问,那么这些疑问就是内核模块的参数是怎么和对应的硬件所匹配上的,而硬件又是怎么被内核识别,并且一个个都映射成实际存在的文件,而这些文件之间的关系及作用.当然在最后了解到,这些硬件设备的探测信息是通过一个叫udev的工具来实现的,通过udev中配置的规则可以很有效的识别每一个硬件,并配合sysfs文件系统,将每个探测到的硬件信息导入到/sys目录中,那么与/proc目录对与内核系统信

动态导入模块

如反射的概念,可以通过hasattr(),getattr(),setattr(),delattr()将字符串类型的方法反射为可以直接调用的方法,那么模块的调用除了正常的调用外,是否也可以将个符串格式的模块名导入到当前目录下呢? 动态导入模块的使用: 官方推荐使用版: import importlib aa=importlib.import_module('lib.aa') 标准导入格式为:importlib.import_module(name,package) 解释器自身使用的是: mod=_

【06】Python 内置函数、redis、yagmail、nnlog、导入模块的实质

1 内置函数 1.1 map()和filter() 1 def bl(i): 2 return str(i).zfill(2) 3 l='12333' 4 # map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回. 5 print(type(map(bl,l))) 6 res = list(map(bl,l)) #,结果放到了一个生成器中,需要强制转换成list.set 7 print(res) #运行结果 <class '

Python之路番外:PYTHON基本数据类型和小知识点

Python之路番外:PYTHON基本数据类型和小知识点 一.基础小知识点 1.如果一行代码过长,可以用续行符 \换行书写 例子 if (signal == "red") and (car == "moving"): car = "stop" else : pass 等同于 if (signal == "red") and (car == "moving"): car = "stop"