【问题标题】:How to work with absolute imports when developing a package开发包时如何使用绝对导入
【发布时间】:2019-03-28 21:22:01
【问题描述】:

我一直在为包中的导入而苦苦挣扎。当我开发一个包时,我到处读到最好在该包的子模块中使用绝对导入。我理解这一点,我也更喜欢它。但后来我不喜欢,我还读到你不应该使用sys.path.append('/path/to/package') 在开发中使用你的包......

所以我的问题是,你如何从零开始开发这样一个包,直接使用绝对导入?目前我使用相对导入来开发包,从那时起我就可以在打包和安装之前测试我正在编写的代码,然后在发布并构建包后更改导入。

做这种事情的正确方法是什么?例如,在 Pycharm 中,您可以将文件夹标记为“source roor”,并且能够像包文件夹在路径中一样工作。我仍然读到这不是正确的方法......我错过了什么?在测试代​​码的同时如何开发包?

【问题讨论】:

    标签: python import package


    【解决方案1】:

    您的里程可能会有所不同,但这是我通常做的:

    在包内 (foo)、绝对 (import foo.bar) 或相对 (import .bar) 对我来说并不重要,只要它有效。有时,我更喜欢相对的,尤其是当项目很大并且有一天我可能决定将许多源文件移动到一个子目录中时。

    我如何测试?我的$PYTHONPATH里面通常有.,我的目录层次是这样的:

    /path/to/foo_project
       /setup.py
       /foo
          /__init__.py
          /bar.py
       /test
          /test1.py
          /test2.py
    

    那么foo_project/test/test1.py 中的脚本将与您通常使用的包一样,使用import foo.bar。当我测试我的代码时,我将在目录foo_project 中运行python test/test1.py。由于我的$PYTHONPATH 中有.,它会找到目录foo 并将其用作包。

    【讨论】:

    • 感谢您的意见。这确实也是我正在做的事情,相对导入,然后是测试/脚本包文件夹。这种方法的问题是我没有在包内使用绝对导入,因此子包中的模块无法访问其他子包中的模块。当层次结构如您的示例中那样平坦时,这种方法效果很好,但是当您有子包时,需要绝对导入。这就是为什么我认为绝对进口是首选和建议的原因。所以主要问题仍然存在,使用绝对导入的人如何开发这些包?
    • 相对导入仍然有效:import ..bar.fubar 表示寻找../bar/fubar.py
    • 当我尝试使用.. 时,我通常会得到ValueError: attempted relative import beyond top-level package。还是得想办法。无论如何,您的回答帮助我澄清了我的疑问。实际上.PYTHONPATH 中,所以我可以使用绝对导入开发包,然后从包含包文件夹(/path/to/foo_project)的存储库文件夹中运行python。该包将始终位于路径中,并且绝对导入将起作用。这是我遗漏的一点,以及 Python 3 消除了隐式相对导入这一事实。感谢您的帮助。
    • 该错误可能是由于您的目录中没有__init__.py。即使是零字节文件也有帮助。这是向 Python 发出的信号,表明该目录是包的一部分
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    • 2014-09-19
    • 2020-01-23
    • 1970-01-01
    相关资源
    最近更新 更多