自动化测试在路上 | 导入自定义模块

* 前文 

形象生动的解释什么是Python的类与对象 |  一文带你了解什么是 " 对象的属性 " | 自动化测试在路上 |  函数及调用 今天接着给大家分享如何导入自定义模块,分享2种方法

Title:导入自定义模块

*简介

模块是Python语言中非常重要的概念,当把一组代码保存为.py格式的文件时,这个文件就是一个模块

在Python体系中,一个Python文件就是一个模块,前面所提到的.py文件其实都是模块

模块通常由函数和类组成,在这里自定义一个study.py的文件,即定义一个名为study的模块

在study的这个模块中定义一个名为love()的函数,同时在study的模块中还定义了一个名为Shuaige的类,而在Shuaige这个类中又定义shengao、tizhong两个方法,该模块的具体代码如下

*代码实例



def love():    print("I , like")

class shuaige:    def shengao(self):        print("178")    def tizhong(self):        print("54kg")

*代码分析

a. 第01行代码,定义了一个love()函数

b. 第02行代码,定义一个名为Shuaige的类,并且类中包含了两个方法

* 通过import语句导入自定义的模块

当study模块创建成功后,就可以调用study模块中的函数和类中的方法,如何调用呢?

方法很简单,在study.py文件(模块)所在的目录创建一个空白py文件,并将其命名为study_one.py

通过Pycharm代码编辑器打开study_one.py这个空白文件,然后study_one.py文件中通过import语句把myboy模块导入就可以达到调用myboy模块中的函数和方法的目的,具体代码如下

*代码实例

import study

list = study.shuaige()

study.love()

list.tizhong()

*代码分析

a. 第01行代码,通过import关键字导入study模块

b. 第02行代码,在Shuaige类中创建一个名叫lisi的帅哥实例,由于调用的是study模块中的类来创建实例,所以类名前面也需要加上模块名称

c. 第03行代码,调用study模块中的love()函数,调用love()函数时需要加入模块名称

d. 第04行代码,由于lisi这个帅哥实例是从Shuaige这个类“出炉”的,那它自然可以调用Shuaige这个类里的方法

*代码输出



F:\Python\Python38-32\python.exe F:/Python/Python38-32/python_code/Study/autotest_unittest/study_one.py178I , like54kg

Process finished with exit code 0

*注意事项

在前文的例子中已经新建了一个zhangsan帅哥实例,怎么这里又新建了一个lisi帅哥实例呢?

在一个类中可以新建多个实例,Shuaige这个类代表的是所有帅哥,它里面的方法和属性也是所有帅哥共有的属性和方法,而不是指某一个帅哥的

所以每当从Shuaige类里“出炉”一个新帅哥时,这个帅哥就拥有了这些方法和属性

study.py文件和study_one.py文件需要放在同一目录下,如不放在一个目录下,study_one模块将无法调用study模块中的函数和其类中的方法,对其他放置的方法初学者可暂时不考虑

Title:通过form…import语句导入自定义模块

如果在调用模块中的函数和类中的方法时不想使用模块名称这个前缀时,还可以使用form…import语句进行导入,如study_one.py文件(study_one模块)中的代码还可以这样写成如下形式

*代码实例

from study import lovefrom study import shuaige

list = shuaige()love()list.shengao()

*代码分析

a. 第01行代码,从myboy模块中直接导入love()函数

b. 第02行代码,从myboy模块中直接导入Shuaige类

c. 第03行代码,在Shuaige类中创建一个名叫lisi的帅哥实例,此时Shuaige类前面没有加模块名称这个前缀

d. 第04行代码,由于采用了form…import语句,所以在myboy_one模块中可以直接调用myboy模块中的love()函数,并且不用加模块名这个前缀

e. 第05行代码,由于lisi这个帅哥实例是从Shuaige类“出炉”的,那它自然可以调用Shuaige类里的tiao_wu()这个方法。

*代码输出F:\Python\Python38-32\python.exe F:/Python/Python38-32/python_code/Study/autotest_unittest/study_one.pyI , like178

Process finished with exit code 0

PS: 部分释义来源于网络检索整理,如有侵权请联系删除

加小编微信加测试开发群

查看更多精彩文章,请订阅以下公众号

推荐阅读

Pytest | 参数化处理三种类型 [ 列表、元组、字典]

Pytest框架Fixture+Parametrize参数化应用篇

测试开发面试题 [ Python编程+selenium基础使用 ]

<think>好的,用户的问题是关于在Ray分布式环境中如何正确导入自定义模块。首先,我需要回忆一下Ray的基本概念和其模块导入机制。Ray是一个分布式计算框架,允许用户将任务分发到多个节点或进程执行。在分布式环境中,任务可能在不同的进程或节点上运行,因此如何正确导入自定义模块是关键。 首先,用户可能需要了解Ray的工作节点是如何处理模块导入的。每个工作节点都有自己的Python环境,因此在任务函数中使用的自定义模块需要在所有节点上可用。这意味着,如果自定义模块不在Python的默认路径中,可能需要通过某种方式将这些模块传输或同步到各个节点。 接下来,我需要考虑几种可能的解决方案。第一种是使用ray.init()时的runtime_env参数,这是Ray较新版本引入的功能,允许指定运行时环境,包括工作目录和依赖项。这样可以自动将本地代码打包并分发到各个工作节点。这是比较推荐的方法,因为它简化了模块分发的步骤。 第二种方法是手动将模块路径添加到sys.path中。在分布式任务中,如果模块不在标准路径下,可能需要动态添加路径。例如,在任务函数内部,或者在启动脚本时,将模块所在的目录添加到sys.path,确保可以正确导入。 第三种方法是使用文件系统共享。如果所有工作节点可以访问同一个网络文件系统(如NFS),可以将自定义模块放在共享目录中,各节点从该目录导入模块。不过这种方法依赖于共享文件系统的配置,可能不适合所有环境。 此外,还需要考虑模块的序列化问题。Ray在分发任务时会将函数及其依赖序列化,因此如果自定义模块中有不可序列化的对象,可能会导致问题。需要确保模块中的代码可以被正确序列化和反序列化。 然后,我需要验证这些方法的正确性。例如,使用runtime_env的示例是否正确,路径是否正确,是否需要在所有节点上安装相同的依赖等。同时,需要提醒用户注意版本兼容性,不同Ray版本可能对runtime_env的支持不同,需要确保版本符合要求。 可能还需要提到一些常见错误,比如模块未找到、路径错误、权限问题等,以及如何调试这些问题。例如,可以在任务函数中打印sys.path,检查模块是否被正确添加。 最后,结合用户提供的引用资料,特别是引用[1]和[4]中提到的Ray分布式计算和并行处理的内容,可以强调使用Ray的runtime_env或Dask/Modin等方法在分布式环境中处理模块导入的优势。同时,引用[3]提到的MapReduce的分块处理思路,可以类比Ray的任务分发机制,帮助用户理解模块导入的必要性。 总结起来,回答需要分步骤说明不同的方法,给出代码示例,并指出注意事项和常见问题,确保用户能够根据实际情况选择合适的方式导入自定义模块。</think>在RAY分布式环境中正确导入自定义模块需要根据任务执行模式选择合适的方法。以下是三种常用方法及示例: --- ### 方法一:使用runtime_env自动同步(推荐) 在Ray 1.4+版本中,可通过`runtime_env`配置自动打包本地代码: ```python import ray # 初始化Ray时指定工作目录 ray.init(runtime_env={"working_dir": "./src"}) # 假设自定义模块在src目录下 @ray.remote def my_task(): from my_module import my_function # 模块自动同步到所有节点 return my_function() # 调用任务 ray.get(my_task.remote()) ``` --- ### 方法二:动态路径添加 在任务函数中手动添加模块路径: ```python import ray import sys import os @ray.remote def dynamic_import_task(): # 动态添加模块路径 sys.path.append(os.path.abspath("../lib")) from custom_lib import utils return utils.process_data() ray.init() ray.get(dynamic_import_task.remote()) ``` --- ### 方法三:文件系统共享 当使用NFS等共享存储时: ```python import ray @ray.remote def shared_import_task(): # 假设所有节点挂载了/mnt/shared_code目录 import sys sys.path.append("/mnt/shared_code") from shared_module import algorithm return algorithm.run() ray.init() ray.get(shared_import_task.remote()) ``` --- ### 关键注意事项 1. **版本一致性**:所有节点的Python环境和依赖包需保持一致[^1] 2. **序列化限制**:自定义模块中避免包含不可序列化对象(如文件句柄) 3. **路径规范**:使用绝对路径而非相对路径,防止分布式节点路径差异 4. **性能优化**:大型模块建议预先打包成Docker镜像[^4] ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值