9

我正在用 Python 编写一个简单的 IronWorker来使用 AWS API 做一些工作。

为此,我想使用通过 PiPy 分发的boto 库。IronWorker 运行时环境中默认不安装 boto 库。

如何将 boto 库依赖项与 IronWorker 代码捆绑在一起?

理想情况下,我希望我可以使用诸如可用于 Ruby IronWorkers 的 gem 依赖捆绑之类的东西- 即myRuby.worker指定

gemfile '../Gemfile', 'common', 'worker' # merges gems from common and worker groups

Python Loggly 示例中,我看到使用了 hoover 库:

#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

但是,我看不到您在哪里/如何指定您想要的 hoover 库版本,或者从哪里下载它。

在 Python IronWorkers 中使用 3rd 方库的官方/正确方法是什么?

4

2 回答 2

13

较新的 iron_worker 版本具有对pip命令的本机支持。所以,你需要:

runtime "python"
exec "something.py"

pip "boto"
pip "someotherpip"

full_remote_build true
于 2013-01-11T12:58:12.507 回答
6

[编辑]自从编写并接受此答案以来,我们已经对我们的工具集进行了一些研究。下面我同事的回答是推荐的前进课程。[/edit]

我为 IronWorker 编写了 Python 客户端库。我也受雇于 Iron.io。

如果您使用 Python 客户端库,最简单(也是推荐)的方法是复制库的已安装文件夹,并在上传包时包含它。这就是上面的 Python Loggly 示例所做的。正如你所说,这并没有指定版本或从哪里下载库,因为它不在乎。它只需要安装在您系统上的那个并使用它。当您在本地机器上输入“import boto”时,无论您得到什么,都会被上传。

另一种选择是使用我们的CLI上传您的工人,并带有.worker 文件

为此,您需要执行以下操作:

创建一个 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 脚本,它将实际运行您的工作程序。我已经包括了我们在下面使用的那个。只需将其保存为 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 文件相同的目录在。

希望这可以帮助!

于 2012-11-08T19:20:09.147 回答