根据我的理解,您的问题是:
我如何与团队共享一个Python库,而他们可能没有使用Python?
我如何确保接收方团队运行的是我的代码及其依赖项?
并且接收方团队可以在大多数地方轻松安装这些依赖项吗?
这个问题没有简单的答案...因为您提到可能将其集成到某个Web服务中,但您不知道该服务的实际平台。
您还问道:
作为一种可能的解决方案,我考虑以下内容。我启动一个Python进程来监听套接字,接受传入的字符串,将它们转换为JSON,将JSON给予“发布”函数,并将输出JSON作为字符串返回。这个解决方案有什么缺点吗?换句话说,“发布”Python函数作为后台进程监听套接字是一个好主意吗?
最简单的情况下,我会总体上说不建议。启动网络服务器(例如内置于Python中的HTTP服务器)非常容易。但是,即使被称为“微型”,服务也意味着基础架构、安全等等。
- 如果部署机器上没有您期望的端口会怎样?-当您重新启动该机器时会发生什么?
- 在失败时,服务器将如何启动或重新启动?
- 是否也需要提供Linux上的upstart或systemd服务?
- 您简单的套接字或Web服务器是否支持多个并发请求?
- 暴露套接字是否存在安全风险?
等等。在部署后,我对“简单”的套接字服务器的经验是,它们最终并不那么简单。
在大多数情况下,最好避免一开始就重新分发套接字服务。如果需要,这里提出的方法可以在以后更简单地打包整个服务。
相反,我建议使用简单的命令行界面进行美好的打包安装。
需要考虑的最小要素为:
- 提供可在许多操作系统上调用函数的便携式机制
- 确保您打包函数时可以安装所有正确的依赖项
- 使其易于安装并提供一些文档!
步骤1。最简单的共同点是提供一个命令行界面,接受JSON文件的路径,并在标准输出上返回JSON。 这将在Linux、Mac和Windows上运行。
这里的说明应该适用于Linux或Mac,并需要稍微调整Windows(仅针对下面的configure.sh
脚本)
一个最简单的Python脚本可能是:
"""
Simple wrapper for calling a function accepting JSON and returning JSON.
Save to predictor.py and use this way::
python predictor.py sample.json
[
"a",
"b",
4
]
"""
from __future__ import absolute_import, print_function
import json
import sys
def predict(json_input):
"""
Return predictions as a JSON string based on the provided `json_input` JSON
string data.
"""
validated = json.loads(json_input)
with_predictions = validated
return json.dumps(with_predictions, indent=2)
def main():
"""
Print the JSON string results of a prediction, loading an input JSON file from a
file path provided as a command line argument.
"""
args = sys.argv[1:]
json_input = args[0]
with open(json_input) as inp:
print(predict(inp.read()))
if __name__ == '__main__':
main()
您可以通过传递JSON文件的路径来处理大量输入。
第二步。将您的函数打包。在Python中,这可以通过创建setup.py脚本实现。它会安装Pypi中的任何相关代码。这将确保您所依赖的库的版本是您期望的版本。在此示例中,我添加了nltk作为依赖项。添加您自己的依赖项:例如scikit-learn、pandas、numpy等。这个setup.py还会自动创建一个bin/predict脚本,这将是您的主要命令行接口。
from __future__ import absolute_import, print_function
from setuptools import setup
from setuptools import find_packages
setup(
name='predictor',
version='1.0.0',
license='public domain',
description='Predict your life with JSON.',
packages=find_packages(),
install_requires=['nltk >= 3.2, < 4.0'],
entry_points={'console_scripts': ['predict = prediction.predictor:main']}
)
此外,为了使安装代码更简单,与 Python 常见的做法一样,我创建了一个“Python 包”目录并将预测器放在此目录中。
第三步。 现在您需要将它们打包,以便轻松安装。一个简单的
configure.sh
脚本可以完成这项工作。它安装了
virtualenv
、
pip
和
setuptools
,然后在项目所在目录下创建了一个
virtualenv
并在其中安装您的预测工具(
pip install .
与
python setup.py install
的作用是相同的)。通过此脚本,您确保运行的代码是您希望运行的代码,并拥有正确的依赖关系。此外,您还确保这是一个隔离的安装,对目标系统的依赖和影响最小。这在 Python 2 上经过了测试,但在 Python 3 上也很可能有效。
#!/bin/bash
ARCHIVE=15.0.3.tar.gz
mkdir -p tmp/
wget -O tmp/venv.tgz https://github.com/pypa/virtualenv/archive/$ARCHIVE
tar --strip-components=1 -xf tmp/venv.tgz -C tmp
/usr/bin/python tmp/virtualenv.py .
. bin/activate
pip install .
echo ""
echo "Predictor is now configured: run it with:"
echo " bin/predict <path to JSON file>"
最终,您将获得一个完全配置好、隔离的、易于安装的代码片段,并配有简单、高度可移植的命令行界面。您可以在这个小仓库中查看所有内容:
https://github.com/pombredanne/predictor。您只需克隆或获取该repo的zip或tarball,然后查看README文件,即可开始使用。
请注意,如果需要更复杂的应用程序,包括依赖关系的销售和易于安装而不依赖于网络的更积极方式,您可以查看我维护的这个
https://github.com/nexB/scancode-toolkit工具包。
如果您真的想要公开Web服务,您可以重新利用这种方法,并使用简单的Web服务器(例如Python标准库或瓶子或Flask或gunicorn中内置的服务器)打包它,并提供configure.sh以安装所有内容并生成启动命令行。
pex
工具 https://github.com/pantsbuild/pex - Compadre