модуль не найден ошибка, когда скрипт Python запускается из командной строки - PullRequest
0 голосов
/ 22 октября 2019

У меня есть скрипт Python, который принимает файл.txt в качестве аргумента.

Когда я запускаю из командной строки Windows, он жалуется на следующую ошибку.

*C:\Projects\ATR220TA\ISO8583_Payment>python C:\Projects\ATR220TA\ISO8583_Payment\ISO8583.py C:\Projects\ISO8583.txt
Traceback (most recent call last):
  File "C:\Projects\ATR220TA\ISO8583_Payment\ISO8583.py", line 19, in <module>
    from ISO8583_Payment.ISOErrors import InvalidIso8583, ValueToLarge, InvalidValueType, InvalidBitType, BitInexistent, \
ModuleNotFoundError: No module named 'ISO8583_Payment'
C:\Projects\ATR220TA\ISO8583_Payment>pause*

В основном, ISO8583_Payment - это подпапка моего основного проекта, но по какой-то причине ISO8583_Payment считается модулем и выдает ошибку «модуль не найден».

ISO8583.py

def ParseRawMessage(ISO8583TextFile):
    with open(ISO8583TextFile, 'rb') as in_file:
        contents = in_file.read()
        hex_bytes = binascii.hexlify(contents)
        IsoStr = hex_bytes.decode("ascii")
        Iso8583 = ISO8583()
        try:
            Iso8583.setIsoContent(IsoStr)
        except InvalidMTI as error:
            print("{0}".format(error))
        except InvalidBitType as error:
            print("{0}".format(error))
        except ValueToLarge as error:
            print("{0}".format(error))
        except InvalidValueType as error:
            print("{0}".format(error))
        except BitInexistent as error:
            print("{0}".format(error))
        except BitNotSet as error:
            print("{0}".format(error))
        except InvalidIso8583 as error:
            print("{0}".format(error))
        bitsAndValuesDictionary = Iso8583.getBitsAndValues()
        for v in bitsAndValuesDictionary:
            print('%s (BIT-%s) = %s' % (v['name'], v['bit'], v['value']))


if __name__ == '__main__':
    ParseRawMessage(sys.argv[1])

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

@ Мика Барнетт, Ваше предложение не сработало, когда я запускаю из командной строки. Ранее я уже упоминал, что это работает для меня, но я только что понял, что это работает только при запуске из IDE pyCharm (извините за путаницу). И ISO8583.py, и ISO8583Errors.py находятся внутри папки ISO8583_payment. Кроме того, я создал __init.py__ внутри ISO8583_Payment папки в соответствии с вашим предложением.

ISO8583.py

import sys
sys.path.append("/ISO8583_Payment")
from ISO8583_Payment.ISOErrors import InvalidBitType,InvalidMTI,InvalidValueType,InvalidIso8583,ValueToLarge,BitInexistent,BitNotSet
''' I did not copy all the source code in here ''''

def ParseRawMessage(ISO8583TextFile):
    with open(ISO8583TextFile, 'rb') as in_file:
        contents = in_file.read()
        hex_bytes = binascii.hexlify(contents)
        IsoStr = hex_bytes.decode("ascii")
        Iso8583 = ISO8583()
        try:
            Iso8583.setIsoContent(IsoStr)
        except InvalidMTI as error:
            print("{0}".format(error))
        except InvalidBitType as error:
            print("{0}".format(error))
        except ValueToLarge as error:
            print("{0}".format(error))
        except InvalidValueType as error:
            print("{0}".format(error))
        except BitInexistent as error:
            print("{0}".format(error))
        except BitNotSet as error:
            print("{0}".format(error))
        except InvalidIso8583 as error:
            print("{0}".format(error))
        bitsAndValuesDictionary = Iso8583.getBitsAndValues()
        for v in bitsAndValuesDictionary:
            print('%s (BIT-%s) = %s' % (v['name'], v['bit'], v['value']))


if __name__ == '__main__':
    ParseRawMessage(sys.argv[1])

ISOErrors.py

class ValueToLarge(Exception):

    def __init__(self, value):
        self.str = value
    def __str__(self):
        return repr(self.str)

class BitInexistent(Exception):

    def __init__(self, value):
        self.str = value
    def __str__(self):
        return repr(self.str)       


class InvalidValueType(Exception):

    def __init__(self, value):
        self.str = value
    def __str__(self):
        return repr(self.str)       


class InvalidBitType(Exception):

    def __init__(self, value):
        self.str = value
    def __str__(self):
        return repr(self.str)       


class InvalidIso8583(Exception):

    def __init__(self, value):
        self.str = value
    def __str__(self):
        return repr(self.str)           


class InvalidMTI(Exception):

    def __init__(self, value):
        self.str = value
    def __str__(self):
        return repr(self.str)       

#Exception that indicate that bit is not there.
class BitNotSet(Exception):

    def __init__(self, value):
        self.str = value
    def __str__(self):
        return repr(

Когда я запускаю из командной строки, я все еще получаю следующую ошибку.

C:\Projects\ATR220TA_Work_On_Progress\ISO8583_Payment>python C:\Projects\ATR220TA_Work_On_Progress\ISO8583_Payment
C:\Users\gobiraaj.anandavel\AppData\Local\Programs\Python\Python37-32\python.exe: can't find '__main__' module in 'C:\\Projects\\ATR220TA_Work_On_Progress\\ISO8583_Payment'
0 голосов
/ 22 октября 2019

Когда вы пишете

from ISO8583_Payment.ISOErrors import InvalidIso8583, ValueToLarge, \
InvalidValueType, InvalidBitType, BitInexistent

Вы говорите Python, что ISO8583_Payment - это модуль.

Итак, вы можете добавить пустой файл __init__.py в этот подкаталог или, еслиесли вы хотите оставить его в качестве каталога, используйте этот код, чтобы добавить его в системный путь, чтобы его можно было искать:

import sys
sys.path.append("/ISO8583_Payment")
...