我是python软件包管理的新手,肯定做错了什么。我被鼓励创建如下目录结构:
bagoftricks ├── bagoftricks │ ├── bagoftricks │ │ ├── __init__.py │ │ └── bagoftricks.py │ └── __init__.py ├── README.md └── setup.py
bagoftricks.py包含两个功能,levenshtein()和geofind()。
levenshtein()
geofind()
我想称它们为:
import bagoftricks x = bagoftricks.levenshtein(arg1,arg2)
相反,我发现我必须这样做:
import bagoftricks x = bagoftricks.bagoftricks.levenshtein(arg1,arg2)
有没有一种更好的方式来首先组织我的软件包,而又没有命名冗余?
更新
因此,我按照下面的Avichal Badaya的说明进行操作,并删除了一层嵌套。也就是说,我现在有…
bagoftricks ├── bagoftricks │ ├── __init__.py │ └── bagoftricks.py ├── README.md └── setup.py
但是,要给这个包裹打电话,我还有…
from bagoftricks.bagoftricks import geofind()
要么
import bagoftricks
然后
>>> bagoftricks.bagoftricks.geofind()
而不是想要的…
from bagoftricks import geofind()
import bagoftricks >>> bagoftricks.geofind()
我无法删除多余的嵌套层。类似地,当我尝试删除另一层嵌套时,我的模块是扁平的,如下所示:
bagoftricks ├── __init__.py ├── bagoftricks.py ├── README.md └── setup.py
我根本无法建立套件…
$ python setup.py build running build running build_py error: package directory 'bagoftricks' does not exist
不使用多余的顶级名称导入的自然导入(如标准包使用)的秘密是什么?
一级“ bagoftricks”很好。可以这么说,那只是您的“项目”的名称。在其中,您有setup.py以及其他文件,这些文件告诉打包系统他们需要知道什么。
然后,您可以直接在此模块中或src目录中获取代码。您甚至可以拥有以下结构:
bagoftricks ├── bagoftricks.py ├── README.md └── setup.py
但是我不建议这样做,主要是因为您以后可能需要重新组织事情,并且如果您已经有了一个“适当的”程序包,它会更容易。而且大多数人,工具和文档都假定您有一个软件包,因此更容易。
因此最小值将是:
bagoftricks ├── bagoftricks │ └── __init__.py ├── README.md └── setup.py
随着__init__.py包含的功能要导入。然后,您可以使用以下功能:
__init__.py
from bagoftricks import levenshtein, anotherfunction
一旦__init__.py变得太大,您想将其拆分为几个模块,给您这样的东西:
bagoftricks ├── bagoftricks │ ├── __init__.py │ ├── anothermodule.py │ └── levenshtein.py ├── README.md └── setup.py
__init__.py然后,您应该从各个模块导入功能:
from bagoftricks.levenshtein import levenshtein from bagoftricks.anothermodule import anotherfunction
然后您仍然可以像以前一样使用它们。