我有一个名为foo的包。它的组织如下:
package_dir/foo/foo.py
package_dir/foo/utils.py
package_dir/foo/other.py
package_dir/foo/__init__.py
我可能应该将foo.py命名为其他东西,但是这个库随着时间的推移而不断发展和演变,现在支持其他东西并且现在已经全部使用了。该软件包捆绑在一起并存储在我们内部的pipy服务器上,因此在安装后,我最终会使用/usr/lib/python2.7/site-packages/foo。
从此套餐中导入的最佳方式是什么?
目前我这样做:
import foo
然后我最终在客户端代码中执行此操作:
foo.foo.myfunction()
有很多类和函数用于使用这种方法:
from foo import blah, blah, blah
这有点笨拙。这是包装的pythonic方法吗?有更好的方法吗?
请求任何帮助。
*更新*
所以我已经做到了这一点,但它没有找到我的功能:
from __init__.py:
import foo
import utils
import other
然后我按照这样导入:
import foo
然后在我的代码中我尝试过:
foo.myfunc()
还有:
myfunc()
两人抱怨:
AttributeError: 'module' object has no attribute 'myfunc'
答案 0 :(得分:6)
你有一些选择:
from foo import foo
foo.myfunction()
或者
from foo import foo as something
something.myfunction()
或者
import foo.foo as something
something.myfunction()
或者您可以“推广”某些API,以便它们从顶级发布。在foo/__init__.py
中导入它们,然后您可以从包对象中使用它们。例如,您的新foo/__init__.py
可以是:
from .foo import myfunction
注意显式相对导入语法,以避免顶级foo包和嵌套foo包之间存在歧义。
然后你可以写:
import foo
foo.myfunction()
等等。