如何在IronWorker中捆绑Python依赖项?

时间:2012-11-08 09:14:32

标签: python iron.io

我正在编写一个简单的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中使用第三方库的官方/正确方法是什么?

2 个答案:

答案 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文件在。

希望这有帮助!