Проблемы с pyinstaller и argparse

Статус
Закрыто для дальнейших ответов.

NVA

Новичок
Пользователь
Окт 13, 2020
6
0
1
Russian Federation
Доброе время суток, у меня есть проблемы с кодом (ниже будет дан). Так как я новичок-самоучка в программировании, то мне нужна помощь профессионалов.
Написал кредитный калькулятор, который работает с входными и выходными данными через cmd.exe.
Например, открываю cmd и ввожу туда python creditcalc.py --type=diff --principal=1000000 --periods=10 --interest=10 , аргументы - это кол-во месяцев, процентная ставка, тип кредита и так далее. Код рабочий, все расчеты в cmd выполняет безупречно. Но я хочу сделать это как исполняемый файл и запустить его например на компьютере, где не установлен Python. Мне нужно чтобы после конвертации через pyinstaller в exe файл работа была в консольном окне точно так же как, я вводил в cmd, при этом сохранив модуль argparse в самом коде. Помогите, пожалуйста, разобраться.
  1. OS: Windows 10 (x64)
  2. Python: 3.8.5
  3. Package Version
    ------------------------- ---------
    altgraph 0.17
    future 0.18.2
    pefile 2019.4.18
    pip 20.1.1
    pyinstaller 4.0
    pyinstaller-hooks-contrib 2020.9
    pypiwin32 223
    pywin32 228
    pywin32-ctypes 0.2.0
    setuptools 47.1.0
  4. Python:
    import math
    import sys
    import argparse
    
    lanes = sys.argv
    parser = argparse.ArgumentParser()
    parser.add_argument('--type', dest='credit_type', type=str)
    parser.add_argument('--principal', dest='principal', type=int)
    parser.add_argument('--periods', dest='periods', type=int)
    parser.add_argument('--interest', dest='interest', type=float)
    parser.add_argument('--payment', dest='payment', type=int)
    
    args = parser.parse_args()
    overpayment = 0
    
    if len(lanes) != 5:
        print('Incorrect parameters')
    elif args.interest and args.interest >= 0:
        i = args.interest / 1200
        if args.credit_type == 'diff':
            if args.payment or args.principal < 0 or args.periods < 0:
                print('Incorrect parameters')
            else:
                for m in range(1, args.periods + 1):
                    diff = math.ceil(args.principal / args.periods + i *
                                     (args.principal - (args.principal * (m - 1)
                                                        / args.periods)))
                    print(f'Moth {m}: payment is {diff}')
                    overpayment += diff
                print(f'\nOverpayment = {overpayment - args.principal}')
    
        elif args.credit_type == 'annuity':
            if (args.principal and args.periods)\
                    and (args.principal > 0 and args.periods > 0):
                payment = math.ceil(args.principal *
                                    ((i * (pow(1 + i, args.periods))) /
                                     (pow(1 + i, args.periods) - 1)))
                print(f'Your annuity payment = {payment}!')
                overpayment = payment * args.periods - args.principal
                print(f'Overpayment = {overpayment}')
            elif (args.payment and args.periods) \
                    and (args.payment > 0 and args.periods > 0):
                principal = int((args.payment /
                                 ((i * pow(1 + i, args.periods)) /
                                  (pow(1 + i, args.periods) - 1))))
                print(f'Your loan principal = {principal}!')
                overpayment = args.periods * args.payment - principal
                print(f'Overpayment = {overpayment}')
            elif (args.principal and args.payment) \
                    and (args.principal > 0 and args.payment > 0):
                periods = math.ceil(math.log(args.payment /
                                             (args.payment - i * args.principal), 1 + i))
                years = periods // 12
                months = periods % 12
                if years == 0:
                    print(f'It will take {months} months to repay this loan!')
                elif months == 0:
                    if years == 1:
                        print(f'It will take {years} year to repay this loan!')
                    else:
                        print(f'It will take {years} years to repay this loan!')
                else:
                    print(f'It will take {years} years and {months} months to repay this loan!')
                overpayment = args.payment * periods - args.principal
                print(f'Overpayment = {overpayment}')
        else:
            print('Incorrect parameters')
    else:
        print('Incorrect parameters')
        
    print(input())
    input("Press Enter to finish...")
 

MonaCCi

Пользователь
Пользователь
Сен 30, 2020
66
11
8
17
Это невозможно, насколько я понимаю.
 

NVA

Новичок
Пользователь
Окт 13, 2020
6
0
1
Russian Federation
Это невозможно, насколько я понимаю.
Я подумывал, что можно вырезать весь модуль argparse из кода, но вдруг как-то можно обойти такое редактирование. Спасибо за оперативный ответ, но вдруг это всё же возможно.
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 581
457
83
Доброе время суток, у меня есть проблемы с кодом (ниже будет дан). Так как я новичок-самоучка в программировании, то мне нужна помощь профессионалов.
Написал кредитный калькулятор, который работает с входными и выходными данными через cmd.exe.
Например, открываю cmd и ввожу туда python creditcalc.py --type=diff --principal=1000000 --periods=10 --interest=10 , аргументы - это кол-во месяцев, процентная ставка, тип кредита и так далее. Код рабочий, все расчеты в cmd выполняет безупречно. Но я хочу сделать это как исполняемый файл и запустить его например на компьютере, где не установлен Python. Мне нужно чтобы после конвертации через pyinstaller в exe файл работа была в консольном окне точно так же как, я вводил в cmd, при этом сохранив модуль argparse в самом коде. Помогите, пожалуйста, разобраться.
  1. OS: Windows 10 (x64)
  2. Python: 3.8.5
  3. Package Version
    ------------------------- ---------
    altgraph 0.17
    future 0.18.2
    pefile 2019.4.18
    pip 20.1.1
    pyinstaller 4.0
    pyinstaller-hooks-contrib 2020.9
    pypiwin32 223
    pywin32 228
    pywin32-ctypes 0.2.0
    setuptools 47.1.0
  4. Python:
    import math
    import sys
    import argparse
    
    lanes = sys.argv
    parser = argparse.ArgumentParser()
    parser.add_argument('--type', dest='credit_type', type=str)
    parser.add_argument('--principal', dest='principal', type=int)
    parser.add_argument('--periods', dest='periods', type=int)
    parser.add_argument('--interest', dest='interest', type=float)
    parser.add_argument('--payment', dest='payment', type=int)
    
    args = parser.parse_args()
    overpayment = 0
    
    if len(lanes) != 5:
    print('Incorrect parameters')
    elif args.interest and args.interest >= 0:
    i = args.interest / 1200
    if args.credit_type == 'diff':
    if args.payment or args.principal < 0 or args.periods < 0:
    print('Incorrect parameters')
    else:
    for m in range(1, args.periods + 1):
    diff = math.ceil(args.principal / args.periods + i *
    (args.principal - (args.principal * (m - 1)
    / args.periods)))
    print(f'Moth {m}: payment is {diff}')
    overpayment += diff
    print(f'\nOverpayment = {overpayment - args.principal}')
    
    elif args.credit_type == 'annuity':
    if (args.principal and args.periods)\
    and (args.principal > 0 and args.periods > 0):
    payment = math.ceil(args.principal *
    ((i * (pow(1 + i, args.periods))) /
    (pow(1 + i, args.periods) - 1)))
    print(f'Your annuity payment = {payment}!')
    overpayment = payment * args.periods - args.principal
    print(f'Overpayment = {overpayment}')
    elif (args.payment and args.periods) \
    and (args.payment > 0 and args.periods > 0):
    principal = int((args.payment /
    ((i * pow(1 + i, args.periods)) /
    (pow(1 + i, args.periods) - 1))))
    print(f'Your loan principal = {principal}!')
    overpayment = args.periods * args.payment - principal
    print(f'Overpayment = {overpayment}')
    elif (args.principal and args.payment) \
    and (args.principal > 0 and args.payment > 0):
    periods = math.ceil(math.log(args.payment /
    (args.payment - i * args.principal), 1 + i))
    years = periods // 12
    months = periods % 12
    if years == 0:
    print(f'It will take {months} months to repay this loan!')
    elif months == 0:
    if years == 1:
    print(f'It will take {years} year to repay this loan!')
    else:
    print(f'It will take {years} years to repay this loan!')
    else:
    print(f'It will take {years} years and {months} months to repay this loan!')
    overpayment = args.payment * periods - args.principal
    print(f'Overpayment = {overpayment}')
    else:
    print('Incorrect parameters')
    else:
    print('Incorrect parameters')
    
    print(input())
    input("Press Enter to finish...")
а в чем проблема то? pyinstaller --onefile myfile.py
 
Последнее редактирование:

NVA

Новичок
Пользователь
Окт 13, 2020
6
0
1
Russian Federation
а в чем проблема то? pyinstaller --onefile myfile.py
я так делал уже. и pyinstaller --onefile calculator.py, и pyinstaller --onefile --console calculator.py. Открывается файл, но при вводе данных там просто дублируется то, что я ввел. А мне нужно, чтобы в конвертируемом файле можно было вводить данные так же, как в cmd, другими словами: чтобы оперировался модуль argparse
Безымянный.png
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 581
457
83
скопировал ваш код упаковал через команду pyinstaller --onefile test.py, все работает
py.jpg
 
  • Мне нравится
Реакции: NVA

MonaCCi

Пользователь
Пользователь
Сен 30, 2020
66
11
8
17
скопировал ваш код упаковал через команду pyinstaller --onefile test.py, все работает
Посмотреть вложение 659
То есть это работает без установленного на ПК Python?
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 581
457
83
То есть это работает без установленного на ПК Python?
Попробовал на компе где нет питона, результат тот же, все работает
 
  • Мне нравится
Реакции: NVA

NVA

Новичок
Пользователь
Окт 13, 2020
6
0
1
Russian Federation
Попробовал на компе где нет питона, результат тот же, все работает
скопировал ваш код упаковал через команду pyinstaller --onefile test.py, все работает
Посмотреть вложение 659
это вы запускали конвертируемый файл с самом cmd, где не было питона?
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 581
457
83
это вы запускали конвертируемый файл с самом cmd, где не было питона?
да файл exe
 

NVA

Новичок
Пользователь
Окт 13, 2020
6
0
1
Russian Federation
Так, всем большое спасибо за помощь. И правда, всё работает!) Вы извините если что, я только учусь)
 

NVA

Новичок
Пользователь
Окт 13, 2020
6
0
1
Russian Federation
Вопрос более не актуален.
 
Статус
Закрыто для дальнейших ответов.

Форум IT Специалистов