0

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

我将在这里草拟我的计划以部署我的分析,并且我想知道是否有任何我遗漏的明显漏洞,或者我应该考虑的其他任何事情。我认为我的大纲保持了足够的原子性,以便我可以在需要的时间和地点插入东西,而且还允许我很容易地运行一个脚本。次要(长期)目标是建立一个简单的 Web 前端,允许用户(即我公司的员工)一次调用一个脚本,请参见此处:非常简单的 Web 服务:接受输入,电子邮件结果

我想将脚本部署到服务器,并且正在考虑将我的脚本组织成一组 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
4

1 回答 1

1

作为正式答案:

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

  • 使用您当前的设置,我建议将循环包装在“with”语句中,保持打开的文件句柄,并在结果进入时刷新结果。这使您可以在一定程度上跟踪进度,并让您知道如果您的服务器崩溃,您的测试是否正在运行,以及是否其中一个导致崩溃

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

  • 与输出一样重要,使其有用也很重要。您可能希望它以干净的文本打印,但如果它以 Python 字典开头,并且您将其展平,请在日志文件中添加一个逗号,然后将 dict 转储为字符串,以便您可以将那个东西直接舀回 Python并在需要时操纵数据。

  • 离开最后一点,看看 json.dumps 和 json.loads,尤其是在使用日志和 Web UI 时。javascript 对这种格式很友好,您可以通过将所有内容保持为“python-happy”格式来节省大量工作

  • 如果需要,线程化测试并不难添加。如果你知道你有一项任务需要很长时间才能运行,或者是 IO 密集型的,也许可以让它自己分拆。如果您确实认为您将走这条路,请从一开始就计划好并注意您可能需要保护的变量,或者将所有结果推送到队列而不是字典中以防止竞争条件问题

  • 请注意时间戳的分辨率,尤其是如果您正在加载使用时间戳作为键的字典 o_O ---> 只是不要这样做

  • I noticed the config function and that it accepted args and kwargs. If you are going to allow configuring of tests, either via ui or file, especially if it's a file, use json friendly format, you can do kwargs = json.loads( open(configfile,'r').read() ) and be super happy that you didn't have to write a parser or regex, or modify your code when you add a parameter.

于 2013-02-14T17:46:41.180 回答