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

一、背景

        在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'},# 需要引用的其它文件的目录

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

阿木实验室普罗米修斯项目环境配置

引言 普罗米修斯项目其实只是个大ROS功能包, 里面每个模块就是每个ROS功能包,比如控制模块,视觉模块等等。对PX4配置的与这个一样,另外他是使用自己的P系列无人机(我个人是P450),所…

系统延时函数的实现

滴答定时器的工作原理 STM32F103的内核时钟由AHB总线时钟(72M)经过8分频得到,即72/89M LOAD的取值范围是0-1677215,也就是VAL最多可以计2^24次。 滴答定时器的寄存器 系统延时函数的配置 当需要计1us(1/100 0000)时,9M的时钟就要计9次&#x…

TOWE 高品质220V/380V工业插头插座:插座篇

在不同工业场合和环境中,对工业用插头插座和耦合器的配置有着不同的要求。在实际应用中,我们要根据用途、工作环境、规格大小、外观造型、安装形式、功能等方面进行选择。只有确保正确选择产品,才能确保现实用电环境的安全、高效。 同为科技&…

AntDB-M的审计功能

数据库的审计功能是指对数据库访问行为进行监管,记录数据库里面发生了什么操作,是数据库系统安全功能的组成部分。 AntDB-M的审计功能关注客户端的连接信息,比如:用户名和主机地址、客户端发送的SQL语句、SQL执行访问的对象、修改…

CSS3颜色渐变选择-可以自由拖动DIV的渐变颜色,并直接复制代码即可,方便快捷,供大家学习研究参考

用CSS3实现DIV渐变 可以自由拖动DIV的渐变颜色,并直接复制代码的一款插件 <script src="lib/js/jquery.js"></script> <!-- <script src="lib/js/jquery-ui.js"></script> --> <!-- <link type="text/css"…

Leetcode—713.乘积小于 K 的子数组【中等】

2023每日刷题&#xff08;五十六&#xff09; Leetcode—713.乘积小于 K 的子数组 实现代码 class Solution { public:int numSubarrayProductLessThanK(vector<int>& nums, int k) {int ans 0;int len nums.size();int l 0, r 0;int prod 1;if(k < 1) {re…

TailwindCSS 如何设置 placeholder 的样式

前言 placeholder 在前端多用于 input、textarea 等任何输入或者文本区域的标签&#xff0c;它用户在用户输入内容之前显示一些提示。浏览器自带的 placeholder 样式可能不符合设计规范&#xff0c;此时就需要通过 css 进行样式美化。 当项目中使用 TailwindCSS 处理样式时&a…

知网查重重复率多少标红 神码ai

大家好&#xff0c;今天来聊聊知网查重重复率多少标红&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff1a; 知网查重重复率多少标红 在论文撰写过程中&#xff0c;我们常常需要使用各种查重工具来检测论文的…

在我们日常生活有哪些东西是激光切割机做的

激光加工技术是当前最先进的切割技术&#xff0c;在工业生产中&#xff0c;能解决许多常规方法无法解决的难题&#xff0c;而且应用非常广。让人意想不到的是&#xff0c;很多生活中常见的物品&#xff0c;都是靠激光切割完成的。 它具备精密制造、柔性切割、异形加工、一次成型…

攻防世界题目练习——Web引导模式(五)(持续更新)

题目目录 1. FlatScience2. bug3. Confusion1 1. FlatScience 参考博客&#xff1a; 攻防世界web进阶区FlatScience详解 题目点进去如图&#xff0c;点击链接只能看到一些论文pdf 用dirsearch和御剑扫描出一些隐藏文件&#xff1a; robots.txt: admin.php: login.php: f…

音频APP商业化指南及广告收益提升攻略 | TopOn变现干货

注&#xff1a;声音类娱乐细分行业包括在线音乐、网络音频和网络K歌&#xff0c;本文主要探讨狭义的网络音频行业&#xff0c;其形式包括有声书、相声评书、知识课程、广播剧等版权内容、播客以及语音直播和社交形式。 近年来&#xff0c;音频赛道步入高速增长期。艾媒咨询的最…

破译模式:模式识别在计算机视觉中的作用

一、介绍 在当代数字领域&#xff0c;计算机视觉中的模式识别是关键的基石&#xff0c;推动着众多技术进步和应用。本文探讨了计算机视觉中模式识别的本质、方法、应用、挑战和未来趋势。通过使机器能够识别和解释视觉数据中的模式&#xff0c;模式识别不仅推动了计算机视觉领域…

嵌入式系统复习--概述

文章目录 基本概念嵌入式系统的组成结构嵌入式操作系统嵌入式软件开发环境硬件基础简介下一篇 基本概念 嵌入式计算机&#xff1a;把嵌入到对象体系中、实现对象体系智能化控制的带有微控制器的计算机&#xff0c;称作嵌入式计算机 嵌入式系统&#xff1a;以应用为中心&#…

4年外包终上岸,我只能说这类公司能不去就不去......

我大学学的是计算机专业&#xff0c;毕业的时候&#xff0c;对于找工作比较迷茫&#xff0c;也不知道当时怎么想的&#xff0c;一头就扎进了一家外包公司&#xff0c;一干就是4年。现在终于跳槽到了互联网公司了&#xff0c;我想说的是&#xff0c;但凡有点机会&#xff0c;千万…

LeetCode-654. 最大二叉树【栈 树 数组 分治 二叉树 单调栈】

LeetCode-654. 最大二叉树【栈 树 数组 分治 二叉树 单调栈】 题目描述&#xff1a;解题思路一&#xff1a;递归&#xff0c;这个问题的难点在于如何找到每个子数组的最大值。此处用的是暴力查找最大值&#xff0c;然后递归构建左右子树。解题思路二&#xff1a;单调栈&#xf…

AOP跨模块捕获异常遭CGLIB拦截而继续向上抛出异常

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、BUG详情 1.1 报错信息 1.2 接口响应信息 1.3 全局异常处理器的定义 二、排查过程 三、解决方案 四、总结 前言 最近&…

element table表格内进行表单验证(简单例子,一看就会,亲测有用~)开箱即用!!

效果图&#xff1a; 代码&#xff1a; <div> <el-form ref"form" :model"form" ><el-table :data"form.tableData" align"center" border><el-table-column label"名称"><template slot-scope&…

nuitka Unknown property box-shadow,transition,transform

nuitka 打包后&#xff0c;控制台的错误解决方法 nuitka --standalone --show-memory --show-progress --nofollow-imports --follow-import-toneed --output-dirout --windows-icon-from-ico./static/test.ico mainUI2.py 由于Qt样式表不是CSS&#xff0c;QSS基于CSS2.1&…

Java | Cannot resolve symbol ‘XXX‘

解决办法 (4种解决方案) 1、先检查pom文件依赖是否报错&#xff0c;报错需重新导入 2、检查jdk版本是否与导入项目的版本一致 Ctrlshiftalts打开 3、重启IDEA&#xff0c;清理缓存 IDEA 无法识别同一个 package 里的其他类&#xff0c;将其显示为红色&#xff0c;但…

【SpringBoot】入门精简

目录 一、初识 SpringBoot 1.1 介绍 1.2 项目创建 1.3 目录结构 1.4 修改配置 二、SpringBoot 集成 2.1 集成 Mybatis框架 2.2 集成 Pagehepler分页插件 2.3 集成 Druid数据库连接池 2.4 集成 Log日志管理 一、初识 SpringBoot 1.1 介绍 Spring Boot是一个用于简化Sp…