我在TLV.py
模块的一个函数中定义了命名元组,并在此函数中返回相同的类型。你知道吗
但是当我调用TLV.py公司在另一个模块ISO8583.py
中,命名的元组键无法识别。你知道吗
在下面的示例中,我在TLV.py
的def parse
中定义了EMVTags = collections.namedtuple('EMVTags', 'Tag TagName Value')
,retun值与EMVTags
的类型相同。你知道吗
现在我调用ISO8583.py
中的parse
,Tag
,TagName
和Value
没有标识,因为它给了我以下错误。你知道吗
AttributeError: 'str' object has no attribute 'TagName'
但是当我在Pycharm中运行时,它工作得很好,而当我在windows命令提示符下运行时,它不工作。你知道吗
TLV.py公司
def parse(self, tlv_string):
"""
"""
parsed_data = list()
EMVTags = collections.namedtuple('EMVTags', 'Tag TagName Value')
self.tlv_string = tlv_string
i = 0
while i < len(self.tlv_string):
tag_found = False
for tag_length in self.tag_lengths:
for tag, tag_name in self.tags.items():
if self.tlv_string[i:i + tag_length].lower() == tag.lower():
try:
value_length = int(self.tlv_string[i + tag_length:i + tag_length + 2], 16)
except ValueError:
raise ValueError('Parse error: tag ' + tag + ' has incorrect data length')
value_start_position = i + tag_length + 2
value_end_position = i + tag_length + 2 + value_length * 2
if value_end_position > len(self.tlv_string):
raise ValueError('Parse error: tag ' + tag + ' declared data of length ' + str(
value_length) + ', but actual data length is ' + str(
int(len(self.tlv_string[value_start_position - 1:-1]) / 2)))
value = self.tlv_string[value_start_position:value_end_position]
parsed_data.append(EMVTags(Tag=tag, TagName=tag_name, Value=value))
i = value_end_position
tag_found = True
if not tag_found:
msg = 'Unknown tag found: ' + self.tlv_string[i:i + 10]
raise ValueError(msg)
return parsed_data
ISO8583.py
def ParseRawMessage(ISO8583TextFile):
with open(ISO8583TextFile, 'rb') as in_file:
hex_bytes = in_file.read()
IsoStr = hex_bytes.decode('ascii')
Iso8583 = ISO8583()
try:
Iso8583.setIsoContent(IsoStr)
except ISOErrors.InvalidMTI as error:
print("{0}".format(error))
bitsAndValuesDictionary = Iso8583.getBitsAndValues()
print('\n\n### ISO8583 Message ###\n')
for v in bitsAndValuesDictionary:
print(' %s (BIT-%s) = %s\n' % (v['name'], v['bit'], v['value']))
if v['bit'] == '55':
Field55StringValue = v['value'][4:]
if Field55StringValue:
from pytlv.TLV import TLV
tlv = TLV()
try:
EmvTagValueList = tlv.parse(Field55StringValue)
print('\n\n\t### EMVTags of Field-55 ###\n')
for TagValue in EmvTagValueList:
print(TagValue.TagName + ' ({})'.format(TagValue.Tag) + ' = {}'.format(TagValue.Value))
except ValueError as error:
print("Invalid field/fields in Field-55 ")
namedtuple()
函数基本上是一个类工厂。您需要将该类导入其他模块才能使用它。 我建议您这样做,并在其他模块中导入EMVTags
。你知道吗我确实解决了这个问题。你知道吗
问题的实际根源是TLV.py公司. 因为我已经完成了
pip install for pyTlv
,它在windows
的site-packages
目录中。你知道吗然后我将pyTlv lib的源代码保存到我的项目中,并对name tuple type而不是str type return进行一些更改。你知道吗
因此,当我从
pycharm
使用它时,它正确地选取了TLV.py公司但是当我使用windows cmd
行时,它从我通过pip install
所做的原始TLV.py
中提取。你知道吗相关问题 更多 >
编程相关推荐