def equal_dicts(d1, d2, ignore_keys):
d1_filtered = dict((k, v) for k,v in d1.iteritems() if k not in ignore_keys)
d2_filtered = dict((k, v) for k,v in d2.iteritems() if k not in ignore_keys)
return d1_filtered == d2_filtered
EDIT: это может быть быстрее и экономичнее:
def equal_dicts(d1, d2, ignore_keys):
ignored = set(ignore_keys)
for k1, v1 in d1.iteritems():
if k1 not in ignored and (k1 not in d2 or d2[k1] != v1):
return False
for k2, v2 in d2.iteritems():
if k2 not in ignored and k2 not in d1:
return False
return True
Если вы уверены, что рабочий каталог не изменяется между временем создания шаблона и временем его чтения, то вам не нужно устанавливать какое-либо свойство перед инициализацией Velocity: [1110 ]
IncludeRelativePath
, поскольку его цель - позволить #include () и #parse () находить шаблоны в том же каталоге, что и текущий шаблон. Это не относится к вашему случаю использования. file
, потому что он установлен по умолчанию. classpath
, потому что вы даже не используете его Я не знаю, почему ваш код работает локально, а не в производство. Возможно, рабочий каталог изменился. Возможно переменные templateName
и fileName
не согласованы. Возможно, шаблон запрашивается до того, как он будет написан. Есть ли серьезные различия между средами? Есть проблемы с безопасностью? Операционные системы одинаковы? Как отметил soorapadman, это может быть проблема с чувствительностью к регистру между Linux и Windows.
Следующий код должен работать везде:
VelocityEngine velocityEngine = new VelocityEngine();
velocityEngine.init();
PrintWriter out = new PrintWriter("test.vm");
out.println("hello");
out.close();
Template template = velocityEngine.getTemplate("test.vm");