我是奥斯汀一家小型创业公司的数据人。我所做的所有分析(到目前为止)都存储为我从笔记本电脑运行的一组临时脚本。这是一个坏主意。
我要在这里描绘我的计划来部署我的分析,并且我想知道是否有任何我错过的明显漏洞,或者我应该考虑的任何其他问题。我认为我的大纲保持足够的原子,以便我可以在需要的时间和地点插入内容,但也允许我很容易地运行一个脚本。次要(长期)目标是建立一个简单的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
答案 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())和非常高兴您没有必要编写解析器或正则表达式,或在添加参数时修改代码。