前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >轻松导入和执行Python模块的3种技巧

轻松导入和执行Python模块的3种技巧

作者头像
AI算法与图像处理
发布2021-03-14 17:40:23
发布2021-03-14 17:40:23
87900
代码可运行
举报
运行总次数:0
代码可运行

引言

作为一名程序员,你肯定希望与团队其他用户共享你所创建的有用模块。尽管你的模块可能有用,但是如果其他人需要花费大量精力来访问模块中的有用功能,则其他人将不会使用它。

因此,如果想使用户易于使用你的模块,导入和运行模块的代码应该简短。本文将向你展示3种简化导入和执行Python模块的方法。

导入

场景

假设我们有一个名为 utils.py 的文件,其中包含所有重要的函数和类

代码语言:javascript
代码运行次数:0
复制
def add_two(num: int):    return num + 2   
def multiply_by_two(num: int):    return num * 2 
a = 5 

在另一个脚本中,我们使用 from utils import * 从 utils.py 中导入所有内容,除了变量 a 。那我们该怎么做呢?

解决方案

要做到这点很容易,只要加入__all__ = [“add_two”, “multiply_by_two”]即可。使用 import * 时,__all__ 中指定的函数、类和包将被导入。

代码语言:javascript
代码运行次数:0
复制
__all__ = ["add_two", "multiply_by_two"]
def add_two(num: int):    return num + 2   
def multiply_by_two(num: int):    return num * 2 
a = 5 

现在尝试在另一个脚本中使用 import *

代码语言:javascript
代码运行次数:0
复制
from utils import *
num = 3 print(add_two(num))print(multiply_by_two(num))print(a)
代码语言:javascript
代码运行次数:0
复制
56Traceback (most recent call last):  File "main.py", line 6, in <module>    print(a)NameError: name 'a' is not defined

Cool!这个错误告诉我们,只从 utils.py 中导入了 add_two 和 multiply_by_two ,而并未导入变量 a 。

合并多个文件

场景

想象一下我们目录中文件的结构如下:

代码语言:javascript
代码运行次数:0
复制
.├── data_modules│   ├── load_data.py│   └── process_data.py└── main.py

load_data.py 如下所示:

代码语言:javascript
代码运行次数:0
复制
class DataLoader:    def __init__(self, data_dir: str):        self.data_dir = data_dir
    def load_data(self):        print(f"Loading data from {self.data_dir}")

process _ data.py 如下所示:

代码语言:javascript
代码运行次数:0
复制
class DataProcessor:     def __init__(self, data_name: str):        self.data_name = data_name        def process_data(self):        print(f"Processing {self.data_name}")

要使用来自两个不同文件的类,我们需要从每个文件导入每个类。

代码语言:javascript
代码运行次数:0
复制
from data_modules.load_data import DataLoaderfrom data_modules.process_data import DataProcessor
data_loader = DataLoader('data/')data_loader.load_data()
data_processor = DataProcessor('data1')data_processor.process_data()

这个方法很好,但是使用2个导入语句是很繁琐的。有没有一种方法,我们可以把两个导入语句变成一个导入语句,就像下面这样。

代码语言:javascript
代码运行次数:0
复制
from data_modules import DataLoader, DataProcessor

解决方案

在 data _ modules 目录下插入 _ init _. py 文件可以很容易地解决这个问题:

代码语言:javascript
代码运行次数:0
复制
touch data_modules/__init__.py

然后将前面提到的 import 语句插入到 _ init _. py 文件中:

代码语言:javascript
代码运行次数:0
复制
from .load_data import DataLoaderfrom .process_data import DataProcessor

我们在这里使用一个 "." ,因为 load_data.py 和 _init _. py 在同一个目录中。

现在,让我们尝试从 data_modules 导入 DataLoader 和 DataProcessor 。

代码语言:javascript
代码运行次数:0
复制
from data_modules import DataLoader, DataProcessor
data_loader = DataLoader('data/')data_loader.load_data()
data_processor = DataProcessor('data1')data_processor.process_data()
代码语言:javascript
代码运行次数:0
复制
Loading data from data/Processing data1

太棒了! 成功了!

像脚本一样运行目录

场景

我们的目录是这样的:

代码语言:javascript
代码运行次数:0
复制
.└── data_modules    ├── __init__.py    ├── load_data.py    ├── main.py    └── process_data.py

当我们运行 main.py 的时候是这样的:

代码语言:javascript
代码运行次数:0
复制
$ python data_modules/main.py

我们可能希望简化用户或队友运行 main.py 代码的步骤,只需运行父目录:

代码语言:javascript
代码运行次数:0
复制
$ python data_modules

这比运行 data_modules/main.py 更好,因为它更短,用户不需要知道 data_modules 中有哪些文件。

我们怎么才能做到呢?

解决方案

这时,__main__.py 就派上用场了。只需将运行顶级目录时要运行的脚本更改为__main__.py 即可。在我们的例子中,我们需要将 main.py 变为__main__.py。

代码语言:javascript
代码运行次数:0
复制
# Rename main.py to __main__.py$ mv data_modules/main.py data_modules/__main__.py

我们的新目录将如下所示

代码语言:javascript
代码运行次数:0
复制
.└── data_modules    ├── __init__.py    ├── load_data.py    ├── __main__.py    └── process_data.py

现在让我们测试下

代码语言:javascript
代码运行次数:0
复制
$ python data_modulesLoading data from data/Processing data1

效果非常好!

总结

在本文中,我们了解了如何让你和那些使用你的软件包的人更容易使用它。希望可以帮到你~

· END ·

HAPPY LIFE

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI算法与图像处理 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档