我正在创建一个包含多个模块的Python包。我想确保当我在包中导入它们仅从包中导入的模块时,而不是在具有相同名称的包之外的模块。
这样做的正确方法是使用相对导入吗?当我将包裹移动到我的机器上的不同位置时(或者安装在客户机器上的任何位置),这会干扰吗?
答案 0 :(得分:3)
现代相对导入(here's a reference)是与包相关的和特定于包的,因此只要包的内部结构没有改变,您就可以将包整体移动到任何您想要的位置。
虽然Joran Beasley's answer应该也可以正常工作(虽然在那些绝对导入不是默认导入的旧版Python中似乎没有必要,因为首先在包的目录中检查旧的导入样式),我个人当你不需要修改导入路径时,尤其如果你需要加载模块或软件包现在影响的其他软件包或模块。
但是警告:这些确实要求相关模块作为包的一部分加载,或者至少设置__name__
来指示包中的位置。相对导入在__name__ == '__main__'
时不适用于模块,因此如果您正在编写一个简单/随意的脚本,该脚本使用与其相同的目录中的另一个模块(并且希望确保脚本引用正确的目录,如果当前工作目录没有设置为脚本,事情将无法正常工作,你可以做import os, sys; sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
之类的事情(感谢https://stackoverflow.com/a/1432949/138772的想法)。正如S.Lott's answer to the same question中所述,这可能不是你想要专业或作为团队项目的一部分做的事情,但对于个人而言,你只是做一些琐碎的任务自动化或类似事情应该是细
答案 1 :(得分:2)
sys.path
告诉python在哪里寻找导入
添加
import sys
sys.path.insert(0,".")
到你的主python脚本的顶部这将确保在内置包之前导入本地包(虽然我认为这是自动发生的)
如果您真的只想导入文件夹中的包
import sys
sys.path = ["."]
但是我不推荐这个,因为可能会破坏很多你的东西......
大多数IDE(eclipse / pycharm / etc)提供了设置项目使用的环境的机制,包括其路径
真正最好的选择是不要将软件包命名为与系统上安装的内置软件包或第三方软件相同
最好的选择是通过正确捆绑的软件包分发它,这应该足够了