我正在编写一个简单的IronWorker in Python来使用AWS API进行一些工作。
为此,我想使用通过PiPy分发的boto library。默认情况下,IronWorker运行时环境中未安装boto库。
如何将boto库依赖性与我的IronWorker代码捆绑在一起?
理想情况下,我希望我可以使用类似gem dependancy bundling available for Ruby IronWorkers的内容 - 即myRuby.worker
指定
gemfile '../Gemfile', 'common', 'worker' # merges gems from common and worker groups
在Python Loggly sample中,我看到使用了胡佛库:
#here we have to include hoover library with worker.
hoover_dir = os.path.dirname(hoover.__file__)
shutil.copytree(hoover_dir, worker_dir + '/loggly') #copy it to worker directory
但是,我无法看到您在何处/如何指定所需的胡佛库版本或从何处下载。
在Python IronWorkers中使用第三方库的官方/正确方法是什么?
答案 0 :(得分:13)
较新的iron_worker版本具有pip
命令的原生支持。
所以,你需要:
runtime "python"
exec "something.py"
pip "boto"
pip "someotherpip"
full_remote_build true
答案 1 :(得分:6)
[编辑]我们已经对我们的工具集进行了一些研究,因为这个答案已被编写和接受。 answer from my colleague below是推荐的前进课程。[/ edit]
我为IronWorker编写了Python客户端库。我也受雇于Iron.io。
如果您正在使用Python客户端库,最简单(和推荐)的方法是复制库的已安装文件夹,并在上传软件包时包含它。这就是Python Loggly示例在上面做的事情。正如您所说,这并没有指定版本或从何处下载库,因为它并不关心。它只需要安装在您的系统上并使用它。无论你在本地机器上输入“import boto”,你得到的就是上传的内容。
另一个选项是使用我们的CLI上传您的工作人员.worker file。
要做到这一点,这就是你需要做的事情:
创建一个botoworker.worker文件:
runtime "binary"
build 'pip install --install-option="--prefix=`pwd`/pips" boto'
file 'botoworker.py'
exec "botoworker.sh"
第二行是将运行以安装依赖项的pip命令。您可以像从命令行运行任何pip命令一样修改它。它将在“构建”阶段在工作程序上执行该命令,因此它只执行一次而不是每次运行任务时。
第三行应该更改为您要运行的Python文件 - 这是您的Python工作文件。这是我们用来测试它的那个:
import boto
如果将其保存为botoworker.py,则上述内容无需任何修改即可使用。 :)
第四行是一个shell脚本,它将实际运行你的worker。我已经包含了我们下面使用的那个。只需将其保存为botoworker.sh,您就不必担心修改上面的.worker文件了。
PYTHONPATH="$HOME/pips/lib/python2.7/site-packages:$PYTHONPATH" python botoworker.py "$@"
您会注意到它指的是您的Python文件 - 如果您没有将您的Python文件命名为botoworker.py,请记住在此处更改它。所有这一切都是将PYTHONPATH设置为包含已安装的库,然后运行Python文件。
要上传它,只需确保安装了CLI(gem install iron_worker_ng,确保您的Ruby版本为1.9.3或更高版本)然后在您的shell中运行“iron_worker upload botoworker”,从您的botoworker的同一目录.worker文件在。
希望这有帮助!