我已经在Python中编写了很长时间,但从未真正尝试打包一段代码以便我可以共享它。我开始读书了 https://python-packaging.readthedocs.io/en/latest/。
我从最简单的情况开始,说我想要共享一个名为' clipper'的模块,唯一重要的是一个名为Clipper的类。似乎我使用setuptools我应该创建一些文件夹
clipper/clipper
并在内部裁剪器内放置文件__init__.py
使用Clipper类的定义。到现在为止还挺好。从理论上讲,在安装包之后,使用该类的方法是:
import clipper
cl = clipper.Clipper()
我的问题是,我假设在开发过程中和安装之前,相同的代码应该可行。我的意思是,前面的代码应该创建一个对象的实例。但那会怎样呢?我应该如何设置PYTHONPATH以便以前的导入实际工作?
也许我遇到了一些非常错误的东西,我认为与编码相比,打包会更容易,但是我花了一些时间而且我没有得到它。有什么帮助吗?
答案 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 您可能会收到有关缺少信息的警告,但您现在可以忽略它。