Python使用其它文件夹中的.py文件

news2024/11/25 7:04:08

一、背景

        在python构建的工程中,A.py 可能要使用 B.py 文件中的函数、或者类、或者变量,如果这两个文件在同一个目录下,只需要在 A.py 中使用 import B 即可,但如果不在同一目录下,则这种方法不可用,将工程下的所有文件放在一个目录下又会显得混乱,那么如何解决这个问题?

        如下图所示,需要在 func_exam.py 中调用 models 文件夹下的 test_module.py 文件中的类。

图1. 项目文件结构
图2. 需要被调用的类

二、sys.path.append(folder_path)

        解决方法之一是使用sys.append,该方法将输入的路径 folder_path 添加到文件查找的路径,因此在 folder_path 路径下的所有文件都可以import。

  • import sys
import sys
import os

# 获取当前.py文件的绝对路径
BASE_DIR = os.path.dirname(os.path.abspath(__file__))

# 将当前.py文件目录下的 models 目录添加到系统路径
# 因此 models 目录下的 .py 文件可以在本语句之后 import
sys.path.append(os.path.join(BASE_DIR , 'models'))

import pointnet2_cls_ssg

        这种方法的缺点在于必须在 sys.path.append 函数之后 import,否则会报错,而且即使正确地 import 了这个文件,那条 import 语句会被打上红色波浪线(运行时不会报错),对强迫症不友好。

图3. 示例代码

三、importlib.import_module(model_name)

        这种方法可以在函数中调用其他文件夹中的 .py 文件,不用使用 import,因此可以设置一个判断条件,根据满足条件与否调用不同的 .py 文件,不需要像 import 一样写死在文件开头。

  • import importlib
import importlib

def test_importlib():
    # 导入 models 目录下的 test_module.py 文件中的内容
    import_model = importlib.import_module('models.test_module')
    amodel = import_model.test_module()
    amodel.print_func()

        由以上代码可知,转到下一级目录是用 'models.test_module' 而不是 'models/test_module'

        也可以将 models 文件夹的路径添加到系统路径,这样直接在函数参数输入模型名即可,无需使用相对路径,且不会出现红色波浪线。实例代码如下:

import os
import sys
import importlib

# 获取当前 .py 文件的绝对路径
BASE_DIR = os.path.dirname(os.path.abspath(__file__))

# 将当前路径下的 models 目录添加到系统目录
sys.path.append(os.path.join(BASE_DIR, 'models'))

def test_importlib():
    # 因为之前已经将 models 目录添加到系统目录,此时直接导入 test_module 即可
    import_model = importlib.import_module('test_module')
    amodel = import_model.test_module()
    amodel.print_func()

四、pip install e.

        使用该方法需要写一个 setup.py 文件,之后使用命令行转到该文件的目录,运行 pip install e.命令,之后即可直接在项目文件中 import 其它文件夹中的 .py 文件。

        setup.py 文件实例如下:

from setuptools import setup

setup(name='models',# 随便写,在piplist里会显示的名字
      packages=['models'],# 在其它文件里import的名字
      package_dir={'models': 'models'},# 需要引用的其它文件的目录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1301540.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

租房小程序源码开发中的5大注意事项

在租房小程序源码开发过程中,有许多关键的注意事项需要开发者和团队特别留意。作为该领域的专家,我将分享5大重要事项,以确保你的租房小程序源码开发顺利进行。 1. 确保代码可靠性和安全性 租房小程序源码的可靠性和安全性是开发过程中最重…

【C++】C++异常语法、使用、规范、异常安全及异常的优缺点

1. C异常概念 异常是一种处理错误的方式,当一个函数发现自己无法处理的错误时就可以抛出异常,让函数的直接或间接的调用者处理这个错误。 throw: 当问题出现时,程序会抛出一个异常。这是通过使用 throw 关键字来完成的。catch: 在您想要处理…

为什么说数字化转型能帮助企业降本增效?

引言 数字化转型是当今商业领域中的关键议题,它不仅是技术的应用,更是一种战略性的变革,对企业而言具有重要意义。在这个数字化时代,企业需要不断适应和采纳新技术,以获得竞争优势并提高效率。 数字化转型旨在将传统业…

成都工业学院Web技术基础(WEB)实验三:CSS字体等属性使用

写在前面 1、基于2022级计算机大类实验指导书 2、代码仅提供参考,前端变化比较大,按照要求,只能做到像,不能做到一模一样 3、图片和文字仅为示例,需要自行替换 4、如果代码不满足你的要求,请寻求其他的…

001两数之和

题意 给出一个数组和一个目标值,让你在数组中找出和为目标值的两个数,并且这两个数在数组中的下标(索引)不同。 示例 输入:nums[2,7,11,15],target9 输出:[0,1] 解释:因为nums[0]nums[1]9&#…

Draw.io or diagrams.net 使用方法

0 Preface/Foreword 在工作中,经常需要用到框图,流程图,时序图,等等,draw.io可以完成以上工作。 official website:draw.io 1 Usage 1.1 VS code插件 draw.io可以扩展到VS code工具中。

PHP基础 - 数组遍历与排序

介绍 在PHP中,数组遍历和排序是常见的操作,用于对数组中的元素进行访问和排序 数组遍历 1)数值数组的遍历 使用 foreach 循环遍历数组:foreach 循环是最常用的遍历数组的方法,它可以遍历索引数组和关联数组。例如:$fruits = array("apple", "banana&q…

浪涌保护器综合选型应用方案

浪涌保护器SPD是一种用于防止电气设备和电子信息系统受到雷电或其他过电压的影响的装置。浪涌保护器的选型是一个重要的工程问题,因为不同的应用场景和设备要求需要不同的浪涌保护器。本文将介绍浪涌保护器的行业分类选型方案,浪涌保护器选型的作用和意义…

智能优化算法应用:基于缎蓝园丁鸟算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于缎蓝园丁鸟算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于缎蓝园丁鸟算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.缎蓝园丁鸟算法4.实验参数设定5.算法…

Python Django Suit:构建现代化的Django后台管理

概要 Django Suit是一款为Django后台管理提供现代、优雅界面的第三方应用,它致力于提升Django开发者的管理体验。本文将深入介绍Django Suit的安装、配置和高级功能,提供详实的示例代码,帮助大家更好地使用和定制Django后台管理界面。 安装与…

科学小论文

赵州桥,是一座右拱桥,它座落于河北省石家庄市赵县城南液河之上。 赵州桥因赵县古称赵州而得名,当地人称之为大石桥,以区别于城西门外的永通桥,也称小石桥。 赵州桥始建于隋代,由匠师李春设计建造&#xff…

Java关键字 —— static 与 final 详细解释!一看就懂 有代码实例运行!

🧸欢迎来到dream_ready的博客,📜相信您对博主首页也很感兴趣o (ˉ▽ˉ;) 📜Java关键字 —— super 详细解释!一看就懂 有代码实例运行! 目录 前言 static static修饰类中的成员变量 static修…

【SpringSecurity】-- 认证、授权

文章目录 SpringSecurity简介快速入门1.准备工作1.2引入SpringSecurity 认证1.登录校验流程2.原理2.1SpringSecurity完整流程2.2认证流程详解 3.解决问题3.1思路分析3.2准备工作3.3.实现3.3.1数据库校验用户3.3.2密码加密存储3.3.3登录接口3.3.4认证过滤器3.3.5退出登录 授权1.…

Mybatis之核心配置文件详解、默认类型别名、Mybatis获取参数值的两种方式

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博客但无从下手,急需…

指针(笔记1)

一、内存和地址 内存及其管理方法: 1.计算机主存储器由一个一个存储单元组成,微型计算机以字节作为存储单元 2.内存区的每一个字节有一个唯一的编号,这就是“地址”,它相当于教学楼中的教室号 3.内存地址,是一个无符号整数(un…

Modelscope Agent初体验与思考

背景:LLM → \to → Agent ChatGPT为代表的大语言模型就不用过多的介绍了,ChatGPT很强大,但是也有做不到的东西。 例如: 实时查询问题:实时的天气,地理位置,最新新闻报道,现实世…

树链剖分(知识点整理)

思路来源 https://www.tuicool.com/articles/ee2QZf6 spoj375(树链剖分)-CSDN博客 概念 直接扒过来了,懒得写了…… 显然轻子树比重子树小,就少于父亲的一半, 然后性质2的证明就是基于此的…… 因为重链是间断的,所以两条重链…

从零开始搭建企业管理系统(四):集成 Knife4j

集成 Knife4j 前言Knife4j是什么集成 Knife4j引入 pom 依赖添加基础配置启动程序测试完善文档信息编写配置类修改 UserController修改 UserEntity修改 BaseEntity 文档效果图swagger 界面knife4j 界面 前言 前面一小节我们使用postman来进行接口的调试,如果接口一多…

服务器GPU占用,kill -9 PID 用不了,解决办法

PID(progress ID 进程ID) 上图为占用情况,使用下面的指令都不管用 kill -9 PID kill -15 PID # 加入sudo 还是不行 # 等等网上的 chatgpt 提供的其他办法,一圈试了下来还是不管用最后解决办法 首先用下面的指令查看进程的树结构…

【LeetCode刷题-树】-- 99.恢复二叉树

99.恢复二叉树 方法: 对二叉搜索树进行中序遍历得到值序列不满足的位置找到对应被错误交换的节点记为x和y交换x和y两个节点 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* Tre…