31

我是 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

没有多余的顶级名称导入,像标准包使用的自然导入的秘诀是什么?

4

3 回答 3

41

第一级“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

然后你仍然可以像以前一样使用它们。

于 2013-07-08T15:39:20.990 回答
3

使用您发布的更新结构

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 *
于 2013-07-08T17:11:43.547 回答
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(),
)

setup 也可能有一些其他参数。我希望这个对你有用。

于 2013-07-03T21:17:09.773 回答