Python包命名和导入

时间:2018-03-19 18:37:25

标签: python python-2.7

我有一个名为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'

1 个答案:

答案 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()

等等。