对包装python项目感到困惑

时间:2017-11-01 16:42:43

标签: python package setuptools

我已经在Python中编写了很长时间,但从未真正尝试打包一段代码以便我可以共享它。我开始读书了    https://python-packaging.readthedocs.io/en/latest/

我从最简单的情况开始,说我想要共享一个名为' clipper'的模块,唯一重要的是一个名为Clipper的类。似乎我使用setuptools我应该创建一些文件夹

clipper/clipper

并在内部裁剪器内放置文件__init__.py

使用Clipper类的定义。到现在为止还挺好。从理论上讲,在安装包之后,使用该类的方法是:

import clipper
cl = clipper.Clipper()

我的问题是,我假设在开发过程中和安装之前,相同的代码应该可行。我的意思是,前面的代码应该创建一个对象的实例。但那会怎样呢?我应该如何设置PYTHONPATH以便以前的导入实际工作?

也许我遇到了一些非常错误的东西,我认为与编码相比,打包会更容易,但是我花了一些时间而且我没有得到它。有什么帮助吗?

2 个答案:

答案 0 :(得分:2)

不是修改Python路径,而是将打包的模块安装为可编辑的版本,您的环境将为您处理此问题。当您将其作为可编辑版本运行时,您将能够更改本地开发实例上的代码。

例如,假设您有Pip,您可以在第一个'clipper'文件夹(与您在打包期间创建的setup.py文件相同的文件夹)中运行以下命令:

pip install -e .
  • -e表示可编辑
  • .表示安装位于当前文件夹中的软件包。

更多细节来自2015年的答案:"pip install --editable ./" vs "python setup.py develop"

答案 1 :(得分:1)

您的目录树看起来有点像这样:

~/clipper/
    setup.py
    clipper/
        __init__.py
        clipper.py

setup.py文件包含告诉Python如何解析'的信息。你的包裹。这里定义了项目名称,版本和要包含的包等内容。对于您的示例,setup.py可能如下所示:

from distutils.core import setup

setup(
    name="Clipper",
    # A name for your package, typically your project name
    description="My first package",
    # A short description
    version="1.0.0",
    # A version specification
    packages=["clipper"]
    # A list of packages to include
)

clipper内,clipper.py包含实际的Clipper类:

class Clipper(object):
    def __init__(self):
        pass

    def foo(self):
        print("Invoked foo!")

__init__.py是一种特殊类型的文件。它定义了与您的包交互的公共接口。通常,它import是所有公共函数和类:

from .clipper import Clipper

最后,要将其转换为正确的包,请运行python3 setup.py sdist。这会为您的包创建 s dist ,并允许您导入 1 。我们现在试试吧。导航回~/clipper/并启动Python:

>>> from clipper import Clipper
>>> c = Clipper()
>>> c.foo()
Invoked foo!
>>>

这里真实的'包目录的示例:

~/calculator/
    setup.py
    calculator/
        __init__.py
        add.py
        substract.py

<强> setup.py

from distutils.core import setup

setup(
    name="Calculator",
    description="Calculate stuff!",
    version="1.0.0",
    packages=["calculator"]
)

<强> __初始化__。PY

from .add import *
from .substract import *

<强> add.py

def add(a, b):
    """Return `a` + `b`."""
    return a + b

<强> substract.py

def substract(a, b):
    """Return `a` - `b`."""
    return a - b

有关详细信息,请参阅Python tutorial on packaging

1 您可能会收到有关缺少信息的警告,但您现在可以忽略它。