python模块/包共享

2024-04-27 00:45:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个flask应用程序,它使用自定义模块的函数

我的文件层次结构如下:

__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__.py,那么ec2/__init__.pycitrixlb/__init__.py如何访问这些函数 在common/__init__.py

原因是

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

Tags: 模块文件函数frompyimport应用程序flask
1条回答
网友
1楼 · 发布于 2024-04-27 00:45:00

If I do the above,and move all common functions to common/__init__.py, how would ec2/__init__.py and citrixlb/__init__.py get access to the functions in 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中两个不同特性的基本原理,以确定哪一个更吸引您


有一件事:

I wish to be able to run the __init__.py in citrixlb and ec2 as standalone scripts.

你不能这么做。作为顶级脚本在包中运行模块不应该起作用。有时你能侥幸逃脱。一旦你从兄弟姐妹或父母那里导入,你肯定不会得逞的

正确的方法是:

  • 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中。详见^{}

相关问题 更多 >