1

I am creating a Python package with multiple modules. I want to make sure that when I import modules within the package that they are importing only from the package and not something outside the package that has the same name.

Is the correct way of doing this is to use relative imports? Will this interfere when I move my package to a different location on my machine (or gets installed wherever on a customer's machine)?

4

2 回答 2

3

现代的相对导入(这里是一个参考)是相对于包和特定于包的,所以只要你的包的内部结构没有改变,你就可以将包作为一个整体移动到任何你想要的地方。

虽然Joran Beasley 的答案也应该有效(尽管在那些不是默认绝对导入的旧版本的 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 对同一问题的回答中所述,这可能不是您想做的专业或团队项目的一部分,但对于您只是在做一些琐碎的任务自动化等个人的事情应该没问题。

于 2014-01-17T20:24:16.603 回答
2

告诉 python在sys.path哪里寻找导入

添加

import sys
sys.path.insert(0,".")

在您的主要 python 脚本的顶部,这将确保在内置包之前导入本地包(尽管我认为这是自动发生的)

如果您真的只想导入文件夹中的包,请执行

import sys
sys.path = ["."]

但是我根本推荐这个,因为它可能会破坏你的很多东西......

大多数 IDE (eclipse/pycharm/etc) 提供了设置项目使用的环境的机制,包括它的路径

最好的选择是不要将软件包命名为与系统上安装的内置软件包或第 3 方模块相同的名称

最好的选择是通过正确捆绑的包分发它,这应该足够了

于 2014-01-17T20:22:38.747 回答