我你的問題的理解歸結爲:
我如何可以共享一個Python庫與我的團隊的其他成員,可能不以其它方式使用Python?
我怎樣才能確保我的代碼和它的依賴是接收團隊將運行?
而且接收團隊可以在任何地方輕鬆地安裝東西嗎?
這是一個簡單的問題,沒有直截了當的答案......正如你剛纔提到的,這可能集成在一些web服務中,但你不知道這個服務的實際平臺。
你也問:
作爲一個可能的解決方案我考慮下。我啓動了一個Python進程,它監聽套接字,接受傳入的字符串,將它們轉換爲JSON,將JSON提供給「已發佈」函數,並將輸出JSON作爲字符串返回。這個解決方案有缺點嗎?換句話說,將Python函數「發佈」爲偵聽套接字的後臺進程是一個好主意嗎?
在最簡單的情況下,對於開始,我會說沒有一般。啓動諸如HTTP服務器(內置Python)的網絡服務器是非常容易的。但是一項服務(即使符合「微」條件)意味着基礎設施,意味着安全等。
- 如果您期望的端口在部署計算機上不可用,該怎麼辦? - 重新啓動機器時會發生什麼?
- 服務器在出現故障時將如何啓動或重新啓動?
- 你還需要最終提供一個新貴或systemd服務(在Linux上)?
- 您的簡單套接字或網絡服務器是否支持多個併發請求?
- 是否存在暴露套接字的安全風險?
等等當我部署時,我對「簡單」套接字服務器的使用經驗是,它們最終並不是那麼簡單。
在大多數情況下,首先避免重新分配套接字服務會更簡單。如果你願意,這裏提出的方法可以用來在後期以更簡單的方式打包整個服務。
我建議改爲簡單的命令行界面很好的安裝。
的一套東西要考慮最小的是:
- 提供一個可移植的機制來調用許多操作系統的功能
- 確保您打包功能,使得它可以與所有的正確安裝依賴
- 可以很容易地安裝,當然提供一些文檔!
步驟1.最簡單的共同點是提供一個接受路徑到JSON文件和吐出JSON上的標準輸出一個命令行界面。 這可以在Linux,Mac和Windows上運行。
在這裏說明應在Linux或Mac工作,並需要爲Windows小幅調整(僅適用於configure.sh
腳本進一步下跌)
一個最小的Python腳本可以是:
#!/usr/bin/env 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.
"""
# this will error out immediately if the JSON is not valid
validated = json.loads(json_input)
# <....> your code there
with_predictions = validated
# return a pretty-printed JSON string
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文件來最終處理大量輸入。
第2步。包裝你的功能。在Python中,這是通過創建setup.py
腳本實現的。這需要照顧從Pypi安裝任何相關的代碼。這將確保您所依賴的庫的版本是您期望的版本。這裏我添加了nltk
作爲依賴關係的一個例子。加你的:這可能是scikit-learn
,pandas
,numpy
等。這setup.py
還自動創建一個bin/predict
腳本,這將是你的主要命令行界面:
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
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(),
# add all your direct requirements here
install_requires=['nltk >= 3.2, < 4.0'],
# add all your command line entry points here
entry_points={'console_scripts': ['predict = prediction.predictor:main']}
)
此外作爲對Python的常見和製作安裝代碼更簡單,我創建了「Python包」目錄中移動預測中這個目錄。
第3步。您現在想包裝易於安裝的東西。一個簡單的configure.sh
腳本來完成這項工作。它安裝virtualenv
,pip
和setuptools
,然後在與項目相同的目錄中創建virtualenv
,然後在其中安裝預測工具(pip install .
基本上與python setup.py install
相同)。通過這個腳本,您可以確保將要運行的代碼是您想要使用正確的依賴關係運行的代碼。此外,您確保這是一個對目標系統具有最小依賴性和影響的獨立安裝。這是用Python 2測試的,但在Python 3上也應該很有可能。
#!/bin/bash
#
# configure and installs predictor
#
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 您只需克隆或獲取回購的zip或tarball,然後閱讀README並開始業務。
請注意,對於更復雜的應用程序,包括出價的依賴關係,以便於安裝,而不依賴於網絡,您可以檢查此https://github.com/nexB/scancode-toolkit我也維護。
如果你真的想公開一個Web服務,你可以重新使用這個方法,並用一個簡單的Web服務器打包(比如Python標準庫或者瓶子或燒瓶或者gunicorn內置的那個)並且提供configure.sh
將其全部安裝並生成命令行以啓動它。
嘗試查看'pex'工具https://github.com/pantsbuild/pex – Compadre
您可以嘗試站起來使用Django服務器並使用Django REST框架http://www.django-rest-framework。組織/。你可以控制環境,那些知道如何編寫代碼的人可以編輯功能。那些不能簡單地調用URL並使用curl或類似來回傳遞JSON數據的人。這可以輕鬆地集成到更高級別的Web服務中。 – Josh
關於問題2,您可能需要編寫一些單元測試。如果單元測試通過了Web團隊,那麼應該很好。 – user1157751