当前位置: 首页 > news >正文

(详解)python调用另一个.py文件中的类和函数或直接运行另一个.py文件

一、同一文件夹下的调用

1.调用函数

A.py文件如下:

def add(x,y):print('和为:%d'%(x+y))

在B.py文件中调用A.py的add函数如下:

import A
A.add(1,2)

from A import add
add(1,2)

2.调用类

A.py文件如下:

class Add:def __init__(self,xx,yy):self.x=xxself.y=yydef add(self):print("x和y的和为:%d"%(self.x+self.y))

在B.py文件调用A.py文件的add函数如下:

# 第一种方法
from A import Add		# 从程序A.py中输入Add()类
a = Add(3,5)				# 对Add()类进行实例化
a.add()							# 调用类中的方法(也就是函数)
# 第二种方法
import A						# 输入程序A.py
a = A.Add(3,5)			 # 对A中的Add()类进行实例化
a.add()							# 调用类中的方法(也就是函数)

二、在不同文件夹下调用

A.py文件的文件路径为:C:\AmyPython\Test1

B.py中调用A.py文件:

import sys
sys.path.append(r'C:\AmyPython\Test1')
#python import模块时,是在sys.path里按顺序查找的。
#sys.path是一个列表,里面以字符串的形式存储了许多路径。
#使用A.py文件中的函数需要先将他的文件路径放到sys.path中
import A
a=A.A(2,3)
a.add()

还有一种方法是创建 __init__.py 文件,参考文章【更为推荐,感觉比添加路径的方式更好】
如果这文件不在一个路径下面,import就比较麻烦了,需要在被import的文件路径下面新建一个__init__.py文件,光创建就行,不需要往里面添加内容。
比如被import的文件路径是…A/b.py下面,那么只要在文件夹A下面分别新建一个__init__.py文件,然后按照下面的语句引用即可:

import A.b

进一步说明

现在文件结构是这样的

root
|
|--A文件夹
|    |--main.py
|
|--B文件夹|--b.py

现在主程序在A文件夹里,想调用B文件夹下的b.py文件,该怎么办呢?
本来以为只需要在a.py中写上:

sys.path.append('../B')
import b as bb

        但实际会报错说 No module named ‘b’
        ps. 这种直接添加相对路径的方式在Jupyter中就没有报错,不知道什么原因。
        其实这个时候用 sys.path 来查看路径的话,会发现确实添加进来了,但添加进来的是一个相对路径,所以添加路径的时候相对路径的参考地址不是当前文件,而是python根目录。

关于这个问题,解决方法有3个:

1、添加绝对路径

sys.path.append('/home/gxp/Documents/B')

2、用拼接路径的方式添加绝对路径(本质和1相同)

sys.path.append(os.path.join(os.path.dirname(__file__),'../B'))

这里join是连接两个路径,__file__是代表当前文件,dirname返回文件夹的绝对路径。所以这里添加的路径本质上是'/home/gxp/Documents/A/../B',也就是说,sys.path.append('/home/gxp/Documents/B')sys.path.append('/home/gxp/Documents/A/../B')的效果是一样的。

3、采用相对引用或其他方法

这种做法存在不少问题,有些到最后也没整明白。
这种做法和上面说的创建 __init__.py 文件的方法似乎是一样的,但这里发现没添加这个文件似乎也正常运行了。
考虑如下文档结构,主程序为 b1.py 或者 main.py。

        如果是main.py 的话会好说很多,因为它在根目录下,直接 import B.b就可以。
        但如果是b1.py的话,可以采用相对导入的方式,可参考文章 Python的绝对引用 vs 相对引用全面讲解,但是自己在用的时候会报错,就像下面这种方式是不能正常运行的,会报错说ImportError: attempted relative import with no known parent package

这似乎是非常非常普遍的问题,但也似乎没有统一的解决方案。

        好像在Pycharm中间接引用就不会出问题,所以可能是VSCode的原因?
        但不管怎么说间接引用其实不是一种很推荐的方式,就像全局变量一样,程序大了容易乱。
        尤其是如果各个子文件夹中的模块还存在互相调用的话,那写起来真的就是乱七八糟了。

import sys
from pathlib import Path
sys.path[0] = str(Path(sys.path[0]).parent.parent)  
# 将工作目录改为项目根目录,这里每一个.parent就是向上翻一级,sys.path[0]就是当前目录from B.B1 import b2 as b2
b2.b2()

这样一来,虽然主程序在一个子文件夹下,但工作目录却是根目录。所以可以像 main.py 那样通过 B.B1来解决。不过这种情况下如果各个子文件夹下的模块存在相互调用的话,也都需要在 import 时做好设置,也有些麻烦但也不是不可以。


所以整来整去,比较好的解决方案还是:
1、主程序不要放在子文件夹下,放在根目录下,然后用 import B.B1.b2的方式比较好。
2、如果主程序放在子文件夹下,一种方案是添加路径,这种方案的好处是可复用性好,但坏处是没有自动提示而且有不识别模块的警告;另一种方案就是把工作目录更改到根目录下,这种方案的好处是有自动提示写起来舒服,坏处是如果各个子文件夹内存在相互调用的话复用性会受影响。(自己还是更倾向于第二种方案,大多数人的程序其实也都有子文件夹内模块相互调用,其实问题不大)

三、运行另一个.py文件

参考文章 https://blog.csdn.net/heart_arsonists/article/details/106988694

3.1 同一目录下

import os
os.system("python filename.py")

3.2 不同目录下

如果按照上面的方法会报错

error sh: /Users//Desktop/.py: Permission denied

正确方式为

import os
os.system('{} {}'.format('python',loc))
# 或者是
os.system('python {}'.format(loc))

这里的loc为字符串,用相对路径即可。
但这样并不能把运行的文件得到的变量输出出来,如果想把结果输出出来并进一步运算,参考文章,所采用的方法是

# 所采用的方法如下
# from 变量所在文件名 import 变量名import os
# os.system('{} {}'.format('python','A/main.py'))
os.system('python {}'.format('A/main.py'))from A.main import c  # 如果在同一目录下则直接 from main import c 即可
d = c+1
print('d=',d)

参考:python调用另一个.py文件中的类和函数或直接运行另一个.py文件

相关文章:

(详解)python调用另一个.py文件中的类和函数或直接运行另一个.py文件

一、同一文件夹下的调用 1.调用函数 A.py文件如下: def add(x,y):print(和为:%d%(xy))在B.py文件中调用A.py的add函数如下: import A A.add(1,2)或 from A import add add(1,2)2.调用类 A.py文件如下: class Add:def __ini…...

每日一题:修改后的最大二进制字符串

给你一个二进制字符串 binary ,它仅有 0 或者 1 组成。你可以使用下面的操作任意次对它进行修改: 操作 1 :如果二进制串包含子字符串 "00" ,你可以用 "10" 将其替换。 比方说, "00010"…...

Redis 5种数据结构常用命令

文章目录 1 字符串2 哈希3 列表4 集合5 有序集合 1 字符串 命令描述set key value设置指定key的值为valueget key获取指定key的值del key [key …]删除一个或多个keymset key value [key value …]设置多个key的值mget key [key …]获取一个或多个key的值incr key将key中储存的…...

23、区间和

区间和 题目描述 假定有一个无限长的数轴,数轴上每个坐标上的数都是0。 现在,我们首先进行 n 次操作,每次操作将某一位置x上的数加c。 接下来,进行 m 次询问,每个询问包含两个整数l和r,你需要求出在区间…...

Python零基础从小白打怪升级中~~~~~~~文件和文件夹的操作 (1)

第七节:文件和文件夹的操作 一、IO流(Stream) 通过“流”的形式允许计算机程序使用相同的方式来访问不同的输入/输出源。stream是从起源(source)到接收的(sink)的有序数据。我们这里把输入/输…...

Qt plugin 开发UI界面插件

目录 1.创建接口 2.创建插件 3.创建插件界面 4.插件实现 5.创建应用工程 6.应用插件 1.创建接口 打开QtCreater,点击左上角“文件”->新建文件或项目,在弹窗中选择C/CHeader File。 输入文件名,选好路径(可自行设置名称…...

Android查看SO库的依赖

➜ bin pwd /Users/xxx/Library/Android/sdk/ndk/21.1.6352462/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/bin ➜ bin ./aarch64-linux-android-readelf -d /Download/libxxx.so 0x0000000000000001 (NEEDED) Shared library: [liblog.so]0x…...

麒麟KOS删除鼠标右键新建菜单里不需要的选项

原文链接:麒麟KOS删除鼠标右键新建菜单里不需要的选项 Hello,大家好啊!在日常使用麒麟KOS操作系统时,我们可能会发现鼠标右键新建菜单里包含了一些不常用或者不需要的选项。这不仅影响我们的使用效率,也让菜单显得杂乱…...

DPDK系列之四十二DPDK应用网络编程UDP编程

一、UDP编程 UDP编程的应用和TCP编程的应用同样非常广泛,如果说真得想使用UDP编程,一般情况下还真得不至于运用DPDK这种重量级的框架。但一个框架的优秀与否,不仅仅在于自身的整体设计优秀,更重要的在于其对应用的支持更完善。 正…...

金三银四面试题(十九):MySQL中的锁

在MySQL中,锁是非常重要的,特别是在多用户并发访问数据库的环境中,因此也是面试中常问的话题。 请说说数据库的锁? 关于MySQL 的锁机制,可能会问很多问题,不过这也得看面试官在这方面的知识储备。 MySQL …...

【JavaScript】原型链/作用域/this指针/闭包

1.原型链 参考资料:Annotated ES5 ECMAScript起初并不支持如C、Smalltalk 或 Java 中“类”的形式创建对象,而是通过字面量表示法或者构造函数创建对象。每个构造函数都是一个具有名为“prototype”的属性的函数,该属性用于实现基于原型的继…...

Python的MATLAB使用

Python和MATLAB是两种不同的编程语言,它们各自拥有不同的生态系统和库。然而,你可以在Python中使用一些方法来实现与MATLAB类似的功能。以下是一些方法和库,可以帮助你在Python中实现MATLAB风格的编程: 1. NumPy: NumPy是Python中…...

文件输入/输出流(I/O)

文章目录 前言一、文件输入\输出流是什么?二、使用方法 1.FileInputStream与FileOutputStream类2.FileReader与FileWriter类总结 前言 对于文章I/O(输入/输出流的概述),有了下文。这篇文章将具体详细展述如何向磁盘文件中输入数据,或者读取磁…...

docker,schedule job和environment variables三者的含义与区别

这三个概念在软件开发和部署中扮演着不同的角色: Docker一般长这样:superlifestyle/sscp-api Schedule Job一般长这样:recorrect_ocr_receipt_status 、Sync2D365 Environment Variables一般长这样:D365_BATCH_OPERATION_SIZE ima…...

90天玩转Python—16—基础知识篇:面向对象知识详解

90天玩转Python系列文章目录 90天玩转Python—01—基础知识篇:C站最全Python标准库总结 90天玩转Python--02--基础知识篇:初识Python与PyCharm 90天玩转Python—03—基础知识篇:Python和PyCharm(语言特点、学习方法、工具安装) 90天玩转Python—04—基础知识篇:Pytho…...

python 标准库之openpyxl的常规操作

目录 openpyxl(Excel文件处理模块) 读sheet 读sheet中单元格 合并单元格 openpyxl模块基本用法 安装方法 基本使用 读取Excel文档 (一)获取工作表 (二)获取单元格 (三)获取…...

90天玩转Python—12—基础知识篇:Python自动化操作Email:发送邮件、收邮件与邮箱客户端操作全解析

90天玩转Python系列文章目录 90天玩转Python—01—基础知识篇:C站最全Python标准库总结 90天玩转Python--02--基础知识篇:初识Python与PyCharm 90天玩转Python—03—基础知识篇:Python和PyCharm(语言特点、学习方法、工具安装) 90天玩转Python—04—基础知识篇:Pytho…...

利用lidar_align来进行lidar和imu标定

文章目录 下载并安装lidar_align安装nlopt迁移NLOPTConfig.cmake修改loader.cpp文件编译并运行 下载并安装lidar_align mkdir -p lidar_align/src cd lidar_align/src git clone https://github.com/ethz-asl/lidar_align.git安装nlopt git clone http://github.com/steven…...

牛客NC93 设计LRU缓存结构【hard 链表,Map Java】

题目 题目链接: https://www.nowcoder.com/practice/5dfded165916435d9defb053c63f1e84 思路 双向链表map最新的数据放头结点,尾节点放最老的数据,没次移除尾巴节点本地考察链表的新增,删除,移动节点参考答案Java im…...

机器学习和深度学习 -- 李宏毅(笔记与个人理解1-6)

机器学习和深度学习教程 – 李宏毅(笔记与个人理解) day1 课程内容 什么是机器学习 找函数关键技术(深度学习) 函数 – 类神经网络来表示 ;输入输出可以是 向量或者矩阵等如何找到函数: supervised Lear…...

低功耗全极霍尔开关芯片 D02,磁性开关点精确,对工艺和温度变化不敏感

1、概述 D02 是一款低功耗全极霍尔开关,用于检测施加的磁通量密度,并提供一个数字输出,该输出指示所感测磁通量幅度的当前状态。这些应用的一个例子是翻盖手机中的 ON/OFF 开关。微功耗设计特别适合电池供电系统,如手机或笔记本电…...

初识--数据结构

什么是数据结构?我们为什么要学习数据结构呢....一系列的问题就促使我们不得不了解数据结构。我们不禁要问了,学习C语言不就够了吗?为什么还要学习数据结构呢?这是因为:数据结构能够解决C语言解决不了的问题&#xff0…...

人工智能前沿成科技竞争新高地

以下文章来源:经济参考报 近日,首届中国具身智能大会(CEAI 2024)在上海举行。作为人工智能领域的前沿热点,具身智能正逐步走进现实,成为当前全球科技竞争的新高地、未来产业的新赛道、经济发展的新引擎。 “…...

【算法刷题day23】Leetcode:669. 修剪二叉搜索树、108. 将有序数组转换为二叉搜索树、538. 把二叉搜索树转换为累加树

文章目录 Leetcode 669. 修剪二叉搜索树解题思路代码总结 Leetcode 108. 将有序数组转换为二叉搜索树解题思路代码总结 Leetcode 538. 把二叉搜索树转换为累加树解题思路代码总结 草稿图网站 java的Deque Leetcode 669. 修剪二叉搜索树 题目:669. 修剪二叉搜索树 解…...

设计一个会议管理系统100问?

会议管理系统的基本功能有哪些?如何确保会议管理系统的安全性?会议管理系统可以支持多少种不同类型的会议?是否有权限管理功能?是否支持会议室预订功能?会议管理系统可以导入外部参与者信息吗?是否支持多种…...

一文搞懂BI、ERP、MES、SCM、PLM、CRM、WMS、APS、SCADA、QMS

在企业信息化数字化过程中我们经常遇到很多系统,比如:MES、ERP、SCM、WMS、APS、SCADA、PLM、QMS、CRM、EAM、BI,这些都是什么系统?有什么功能和作用?它们之间的关系是怎样的? 今天就一文简单分享。 术语 …...

全量知识系统 程序详细设计 之 先验逻辑-实现:从“平凡”回到“平凡” (QA 百度搜索)

Q1. 思考:数学中的平凡,和程序中的平凡(比如POJO)、语言中的平凡(比如纯文本),数据中的平凡(比如 Number)。因为我设计中的全知系统将设计的三个方面刻画为语言设计、程序…...

注解(Annotation) --java学习笔记

注解 就是Java代码里的特殊标记,比如:Override、Test等,作用是:让其他程序根据注解信息来决定怎么执行该程序注意:注解可以用在类上、构造器上、方法上、成员变量上、参数上、等位置处 自定义注解 就是自己定义注解 自定义注解到底该怎么写&#xff1a…...

uniapp 小程序获取WiFi列表

<template><view ><button click"getWifiList">获取WiFi列表</button><scroll-view:scroll-top"scrollTop"scroll-yclass"content-pop"><viewclass"itemInfo"v-for"(item, index) in wifiList&…...

数据可视化-ECharts Html项目实战(11)

在之前的文章中&#xff0c;我们学习了如何在ECharts中特殊图表的双y图以及自定义形状词云图。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 数据可视化-ECh…...