我有一个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__.py
和citrixlb/__init__.py
如何访问这些函数
在common/__init__.py
中
原因是
__init__.py
尽可能稀疏citrixlb
和ec2
中运行__init__.py
独立脚本李>newdir/__init__.py
继续添加功能
这正是explicit relative imports设计的目的:
或者,如果您坚持使用
import *
:你可以用绝对导入来代替。假设顶级包名为
mything
:但在这种情况下,我认为你最好和亲戚在一起 版本。它不仅更加简洁易读,而且更加健壮(如果您重命名
mything
,或者重新组织其结构,或者将整个包嵌入一个更大的包中……)。但是您可能需要阅读PEP 328中两个不同特性的基本原理,以确定哪一个更吸引您有一件事:
你不能这么做。作为顶级脚本在包中运行模块不应该起作用。有时你能侥幸逃脱。一旦你从兄弟姐妹或父母那里导入,你肯定不会得逞的
正确的方法是:
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
中。详见^{相关问题 更多 >
编程相关推荐