ShellCommandActivity和python脚本

时间:2014-07-22 18:38:37

标签: python amazon-web-services amazon-data-pipeline

我尝试使用带有shell命令活动的弹性数据管道来处理一些数据文件。具体来说,我试图使用python来处理一些分阶段的数据。

我对python脚本的第一次尝试看起来像:

#!/usr/bin/env python
import os

print "We've entered the python file"
print os.curdir
print os.listdir(os.curdir)
print ${INPUT1_STAGING_DIR}

由于$ {INPUT1_STAGING_DIR}未定义,因此当第四个print语句被命中时,此代码引发错误。

之后,我尝试将$ {INPUT1_STAGING_DIR}作为参数传递给脚本,并将脚本修改为:

#!/usr/bin/env python
import os
import sys

print "We've entered the python file"
print os.curdir
print os.listdir(os.curdir)
print sys.argv

这次脚本成功完成并具有以下输出。

We've entered the python file
.
['taskRunner.zip', 'mysql-connector-java-bin.jar', 'csv-serde.jar', 'run.sh', 'TaskRunner-1.0.jar', 'pipeline-serde.jar', 'run.out', 'output']
['/mnt/taskRunner/output/tmp/ActivityIdQC6BK20140722T170548Attempt1_command.sh', '${INPUT1_STAGING_DIR}']

同样,$ {INPUT1_STAGING_DIR}未被替换"对于任何类似于我正在进行的文件的事情。我试图做的是什么?如果没有,是否有一个好的解决方法?

2 个答案:

答案 0 :(得分:4)

事实证明$ {INPUT1_STAGING_DIR}被设置为环境变量,可以这样访问。以下脚本适用于我:

#!/usr/bin/python

import os
import sys

print "We've entered the python file"

print os.curdir
print os.listdir(os.curdir)

inputDir = os.getenv('INPUT1_STAGING_DIR')
print inputDir
print os.path.isfile(inputDir)
print os.path.isdir(inputDir)
print os.listdir(inputDir)

答案 1 :(得分:1)

你必须设置Stage = true。此选项作为ShellCommandActivity活动中的下拉字段提供。

具体引用文档: http://docs.aws.amazon.com/datapipeline/latest/DeveloperGuide/dp-concepts-staging.html

在资源上本地暂存数据 输入数据自动复制到资源本地文件系统中。输出数据自动从资源本地文件系统复制到输出数据节点。例如,当您使用staging = true配置ShellCommandActivity输入和输出时,输入数据可用作INPUTx_STAGING_DIR,输出数据可用作OUTPUTx_STAGING_DIR,其中x是输入或输出的数量。

希望这能解决您的原始问题。