我是python包管理的新手,肯定做错了。我被鼓励创建一个目录结构,如下所示:
bagoftricks
├── bagoftricks
│ ├── bagoftricks
│ │ ├── __init__.py
│ │ └── bagoftricks.py
│ └── __init__.py
├── README.md
└── setup.py
bagoftricks.py包含两个函数,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
标准软件包使用自然导入的秘诀是什么,没有多余的顶级名称导入?
答案 0 :(得分:29)
第一级“bagoftricks”很好。这就是你的“项目”的名称。在你有一个setup.py和其他文件告诉包装系统他们需要知道什么。
然后,您可以直接在此模块或src目录中获取代码。你甚至可以只使用这种结构:
bagoftricks
├── bagoftricks.py
├── README.md
└── setup.py
但是我不建议这样做,主要是因为你可能想稍后重组一下,如果你已经拥有一个“正确”的包,那就更容易了。此外,大多数人,工具和文档都假设您有一个软件包,因此更容易。
所以最小值是:
bagoftricks
├── bagoftricks
│ └── __init__.py
├── README.md
└── setup.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
然后你仍然可以像以前一样使用它们。
答案 1 :(得分:1)
遵循以下结构:
bagoftricks
── bagoftricks
│ ├── __init__.py
│ └── bagoftricks.py
├── README.md
└── setup.py
然后您应该能够将其用作:
from bagoftricks.bagoftricks import levenshtein, geofind
但是在文件夹结构中进行更改后: -
pip uninstall <your package name mostly mentioned in setup.py>
并重新安装包
同时检查你的setup.py
#!/bin/env python
import os.path
from setuptools import setup, find_packages
def current_path(file_name):
return os.abspath(os.path.join(__file__, os.path.pardir, file_name))
setup(
name = 'bagoftricks',
version = '0.1',
include_package_data = True,
packages=find_packages(),
)
设置也可能有其他一些参数。我希望它适合你。
答案 2 :(得分:1)
使用您发布的更新结构
bagoftricks
├── bagoftricks
│ ├── __init__.py
│ └── bagoftricks.py
├── README.md
└── setup.py
into bagoftricks/__init__.py import all functions that you need
__init__.py
from bagoftricks import geofind, levenshtein
进入另一个程序,您可以执行以下操作
from bagoftricks import geofind
import bagoftricks; bagoftricks.geofind(); bagoftricks.bagoftriks.geofind()
请注意,您也可以导入外卡
from bagoftricks import *