一个pyhtonmodule中定义的命名元组未被另一个python modu识别

2024-05-16 00:56:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我在TLV.py模块的一个函数中定义了命名元组,并在此函数中返回相同的类型。你知道吗

但是当我调用TLV.py公司在另一个模块ISO8583.py中,命名的元组键无法识别。你知道吗

在下面的示例中,我在TLV.pydef parse中定义了EMVTags = collections.namedtuple('EMVTags', 'Tag TagName Value'),retun值与EMVTags的类型相同。你知道吗

现在我调用ISO8583.py中的parseTagTagNameValue没有标识,因为它给了我以下错误。你知道吗

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 ")

Tags: inpyselfdatastringvaluetagposition
2条回答

namedtuple()函数基本上是一个类工厂。您需要将该类导入其他模块才能使用它。 我建议您这样做,并在其他模块中导入EMVTags。你知道吗

#this line is in the top of the file
import collections
EMVTags = collections.namedtuple('EMVTags', 'Tag TagName Value')
#...

def parse(self, tlv_string):
    """
    """
    parsed_data = list()

    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

我确实解决了这个问题。你知道吗

问题的实际根源是TLV.py公司. 因为我已经完成了pip install for pyTlv,它在windowssite-packages目录中。你知道吗

然后我将pyTlv lib的源代码保存到我的项目中,并对name tuple type而不是str type return进行一些更改。你知道吗

因此,当我从pycharm使用它时,它正确地选取了TLV.py公司但是当我使用windows cmd行时,它从我通过pip install所做的原始TLV.py中提取。你知道吗

相关问题 更多 >