我正在从数据库加载一些python代码(它正在动态映射值,我可以在运行时更改,而无需重新部署代码)。
在我的代码中,我这样做是为了执行数据库代码:
if lMapping:
print lMapping
exec lMapping
lValue = mapping(lValue, lCsvRow)
这里是lMapping的值:
def mapping(pValue, pCsvRow):
lInterimStatus = pCsvRow[5]
lOutComeStatus = pCsvRow[6]
if len(lInterimStatus) == 0:
lStatus = lOutComeStatus
else:
lStatus = lInterimStatus
lStatus = lStatus.lower()
PRIMARY_STATUS_MAPPINGS = {
'completed with lender' : '4828',
'not taken up' : '4827',
'declined across all lenders' : '4726',
'declined broker duplicate' : '4726',
'pending' : '4725',
'pending (in progress with broker)' : '4725',
'pending (in progress with lender)' : '4725',
'lender accept in principle' : '4827',
'lender decline duplicate' : '4743',
'lender decline post code not supported' : '4743',
'lender decline score fail' : '4743',
'lender decline policy fail' : '4743',
'lender decline no client contact' : '4743',
'lender decline general' : '4743',
'lender decline bad data' : '4743',
}
return PRIMARY_STATUS_MAPPINGS[lStatus]
每当我这样做时,我在exec行上遇到语法错误,我无法理解为什么:
(<type 'exceptions.SyntaxError'>:invalid syntax (<string>, line 1)
如果我首先将数据库中的代码写入文件,那么它可以工作:
print lMapping
lFile = open('/mapping.py','w')
lFile.write(lMapping)
lFile.close()
lReadFile = open('/mapping.py')
exec lReadFile
lValue = mapping(lValue, lCsvRow)
答案 0 :(得分:1)
您是BLOB还是其他二进制类型列来存储代码?否则,数据库可能会更改行结尾,exec将与SyntaxError
:
>>> s='''\
... print 'ok'
... '''
>>> s
"print 'ok'\n"
>>> exec s
ok
>>> exec s.replace('\n', '\r\n')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1
print 'ok'
^
SyntaxError: invalid syntax
更新:在文本模式下在Windows上写入文件会将行结尾更改为平台本地文件。规范化它们的另一种方法是:
lMapping = os.linesep.join(lMapping.splitlines())