将Python分析脚本部署到服务器

时间:2013-02-14 17:06:33

标签: python scripting

我是奥斯汀一家小型创业公司的数据人。我所做的所有分析(到目前为止)都存储为我从笔记本电脑运行的一组临时脚本。这是一个坏主意。

我要在这里描绘我的计划来部署我的分析,并且我想知道是否有任何我错过的明显漏洞,或者我应该考虑的任何其他问题。我认为我的大纲保持足够的原子,以便我可以在需要的时间和地点插入内容,但也允许我很容易地运行一个脚本。次要(长期)目标是建立一个简单的Web前端,允许用户(即我公司的员工)一次调用一个脚本,请参见此处:Very simple web service: take inputs, email results

我想将脚本部署到服务器,我想将脚本组织成一组python模块。然后,我希望我的批处理脚本看起来像:

import analysis

batch_dict = analysis.build_batch_dict()
assert sorted(batch_dict.keys()) = ['Hourly', 'Monthly', 'Nightly', 'Weekly']

scripts_to_run = analysis.what_batch() # get from command line?
results_directory = analysis.make_results_directory()
failures = {}
for script in scripts_to_run:
    try:
        script.analyze()
        script.export_results(results_directory)
    except Exception as e:
        failures.update(script.failed(e))

analysis.completed(failures)

我会重写我的分析,以便它们由一个类处理。

class AnalysisHandler(object):
    ...
    def analyze():
        pass
    def export_results(some_directory):
        pass
    def failed(exception):
        pass
    def run_with_non_default_args(*args, **kwargs):
        pass
    def something_else_im_missing_now():
        pass

所有脚本都将由继承自AnalysisHandler的东西处理。

服务器上的目录结构如下所示:

datalytics/
    results/
        02-14-2013/
            script1/
                /log
                /error
                /data
            script2/
                /log
                /error
                /data
            .
            .
            .
            <etc>
    scripts/
        script1/
            bin/
            data/
            doc/
            script_1/
            tests/
            setup.py
        .
        .
        .
    analysis/
        __init__.py
        analysis.py
    batch.py (see above)
    new_script.py
    run_all_tests.py
    run_some_tests.py
    run_this_script.py
    run_everything.py

1 个答案:

答案 0 :(得分:1)

作为正式答案:

  • 注意并尝试在创建文件时捕获异常(您可能会遇到权限问题),尤其是当您添加前端并希望写入员工无法修改的目录时

  • 根据您当前的设置,我建议将循环包装在'with'语句中,保持打开的文件句柄,并在结果出现时刷新结果。这样可以在一定程度上跟踪进度,并且还会告诉您服务器是否崩溃,测试是否正在运行,以及可能是其中一个导致崩溃

  • 您似乎正在开发相当多的框架。虽然unittest模块用于测试python代码,但它当然可以用来替换你的很多框架(即排序测试,指定运行哪些测试,记录等)。它还将为您提供一种简单的方法来附加界面,然后标记测试预期的故障等。

  • 与输出一样重要,使其有用也很重要。您可能希望它以干净的文本打印,但如果它以蟒蛇字典开头,并且您将其展平,则将日志文件中的逗号添加到日志文件中,然后将字符串转储为字符串,以便将该内容直接反馈到python中并在必要时操纵数据。

  • 离开最后一点,看看json.dumps和json.loads,特别是对于w / logs和web UI的工作。 javascript是友好的w /那格式,你可以通过保持一切'python-happy'格式来节省大量的工作

  • 如果需要,线程测试并不难。如果你知道你有一个需要很长时间才能运行的任务,或者是IO密集型的任务,那么可以让它自行解散。如果您确实认为您将要走这条路线,请从头开始计划并了解您可能需要保护的变量,或将所有结果推送到队列而不是字典以避免竞争条件问题< / p>

  • 请注意时间戳的解析,特别是如果您要加载使用时间戳作为键的字典o_O ---&gt;只是不要这样做

  • 我注意到配置功能,它接受了args和kwargs。如果你打算允许通过ui或文件配置测试,特别是如果它是一个文件,使用json友好格式,你可以做kwargs = json.loads(open(configfile,'r')。read())和非常高兴您没有必要编写解析器或正则表达式,或在添加参数时修改代码。