在python中导入外部模块的最佳实践

罗恩

让我用一个简化的例子问这个问题。假设我在一个目录中有一个名为example.py的python2脚本,而我编写的其他脚本名为utils.py。在example.py中,我需要导入一个放置在/A/B/external.py路径下的外部模块。“ A”和“ B”只是文件夹,不是包(不带__ init__.py)。最后,假设在/ A / B /下也有一个utils.py文件,它是由external.py导入的。

如果我以熟悉的方式导入外部模块,则将执行以下操作:

import sys
sys.path.append('/A/B/')
import external

问题是,当我试图导入我的utils的模块,蟒蛇会发现它在字典sys.modules中(因为外部进口的话),因此将不会导入我的剧本,但只有在/ A /一B,其已经进口的。

现在,有解决方法。我可能会更改模块的名称,或将外部模块放入包装中,等等。但是,所有这些都感觉很脏。我找不到做这种事情的“ pythonic”最佳实践。就像您中某些人所猜到的那样,在更复杂的情况下可能会导致非常令人讨厌的错误。另外,PEP8不接受我熟悉的方式,因为模块顶部没有导入命令。

总之,我正在寻找执行此类操作的最佳实践,谢谢。

罗恩

尽管已经过去了将近两年,但据我所知,我想描述正确的答案。TL; DR:最好的方法是完全避免操纵sys.path(!),而改用分发打包机制。

首先,让我们区分分发包和导入包。一个进口包装基本上是包含Python的模块目录(即的.py / pyc文件)和__init__.py文件中声明,这个文件夹确实是一个包。在问题的示例中,这是包含example.py的目录utils.py与此相反,分发程序包是:

一个版本化的存档文件,其中包含用于分发发行版的Python软件包,模块和其他资源文件。

资料来源:PyPA用户指南词汇表

应该知道的另一个术语是脚本python脚本是__main__python文件,可直接通过解释器运行(而其他python文件称为modules)。资料来源:python的docs

在您自己的导入包中,您不应该进行编辑,sys.path因为脚本文件会导入相对于其文件位置的模块,这是所需的行为。如果您打算从导入包外部使用另一个模块(并且让我清楚地说,不是从当前导入包内部的另一个导入包导入的情况,这是正常现象并且效果很好),那么您应该将其作为已安装的分发程序包导入。

我的意思是,外部代码(在示例中,位于A / B /下的external.py模块)应作为分发包提供(其维护者应将其作为包上传到某些分发版)机制,例如PyPi,这很可能是您,但作为另一个软件包开发人员)。然后-作为外部软件包的用户,您应该安装它(例如,与pip install该外部分发软件包的wheel文件一起安装),然后它将由您的环境添加和管理,因此您可以import external并且可以正常使用而不会发生冲突。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章