【问题标题】:python module / package sharingpython模块/包共享
【发布时间】:2015-04-18 00:14:31
【问题描述】:

我有一个烧瓶应用程序,它使用自定义模块中的函数。

我的文件层次结构是这样的:

__init__.py
    ec2/__init__.py
    citrixlb/__init__.py

到目前为止,在根 __init__.py 中,我有一个 from ec2 import * 子句来加载我的模块。

现在我正在添加一个名为 citrixlb 的新“功能”。

citrixlb 和 ec2 中的 __init__.py 文件都使用一些相同的函数来完成它们的任务。

我正在考虑做类似的事情:

__init__.py
    common/__init__.py
    ec2/__init__.py
    citrixlb/__init__.py

如果我执行上述操作,并将所有常用功能移至common/__init__.pyec2/__init__.pycitrixlb/__init__.py 将如何访问这些功能 在common/__init__.py?

原因是

  • 我希望根 __init__.py 尽可能稀疏
  • 我希望能够在citrixlbec2 中运行__init__.py 独立脚本。
  • 我还希望能够通过添加newdir/__init__.py 来继续添加功能

【问题讨论】:

    标签: python python-2.7 module packages


    【解决方案1】:

    如果我执行上述操作,并将所有常用功能移至common/__init__.pyec2/__init__.pycitrixlb/__init__.py 将如何访问common/__init__.py 中的功能?

    这正是 explicit relative imports 的设计目的:

    from .. import common
    

    或者,如果你坚持使用import *

    from ..common import *
    

    您可以改为使用绝对导入来执行此操作。假设您的顶级包名为mything

    from mything import common
    from mything.common import *
    

    但在这种情况下,我认为您最好使用相对版本。它不仅更加简洁易读,而且更加健壮(如果您重命名mything,或者重新组织其结构,或者将整个包嵌入到更大的包中……)。但是您可能需要阅读 PEP 328 中的两个不同功能的基本原理,以决定哪一个对您来说更有吸引力。


    一件事:

    我希望能够在citrixlbec2 中将__init__.py 作为独立脚本运行。

    那,你做不到。将包内的模块作为顶级脚本运行是不应该的。有时你会侥幸逃脱。一旦你从兄弟姐妹或父母那里导入,你肯定不会逃脱它。

    正确的做法是:

    • python -m mything.ec2 而不是 python mything/ec2/__init__.py
    • 在顶层编写一个简单的 ec2 脚本,它的作用类似于 from mything.ec2 import main; main()

    后者是一种足够常见的模式,如果您正在构建setuptools 分发版,它可以自动为您构建ec2 脚本。即使ec2/usr/local/bin 结束,而mything 包在您的site-packages 中,它也会自动使其仍然有效。详情请见console_scripts

    【讨论】:

      猜你喜欢
      • 2012-09-19
      • 1970-01-01
      • 2013-07-03
      • 2018-09-16
      • 1970-01-01
      • 1970-01-01
      • 2018-04-21
      • 2014-07-31
      • 1970-01-01
      相关资源
      最近更新 更多