Python Script работает в IDLE Shell и Bash как .py, а не как .exe - PullRequest
1 голос
/ 04 июня 2019

Я пытаюсь найти значения в словаре, проверить, соответствуют ли они критериям (выше числового предела), и удалить пару ключ: значение из словаря. Это отлично работает в IDLE Shell и Bash, но как только я скрываю файл и пытаюсь запустить его как исполняемый файл, застревает и выдает код ошибки, указывающий, что строку нельзя преобразовать в число с плавающей точкой. Программа запускается, но зависает при вызове «ограничителя» в одном из словарей.

Я пробовал pyinstaller и менял .py на .command (mac) (chmod + x file.command, пробовал использовать int ().

#brings str1 and str2 into single dictionary
def dictionizer(str1, str2):
  str1 = str1.strip().split('\n')
  str2 = str2.split('\n')
  str2 = filter(None, str2)
  d = dict(zip(str1, str2))
  return d

##brings dicitionaries together
def merge(d1, d2):
  merged = d1.copy()
  merged.update(d2)
  return merged

#synthesizes list of strings into dictionaries
d_burgers = dictionizer(burgers, burgers_kcal)
d_breakfast = dictionizer(breakfast, breakfast_kcal)
d_chicken = dictionizer(chicken, chicken_kcal)
d_salad = dictionizer(salad, salad_kcal)
d_fries = dictionizer(fries, fries_kcal)

#creates finds all values above/below limit, removes qualifying       key:value pairs
def limiter(d):
  for k,v in list(d.items()):
    if float(v) >= b_limit + 100:
      del d[k]
    if float(v) <= b_limit - 50:
      del d[k]
  return d

#asks for a kcal limit, divides that limit arbitrarily, creates limits for all meals
print('What is your kcal limit for the day?')
limit = float(input())
b_limit = limit*0.30 
l_limit = limit*0.35
d_limit = limit*0.35

#sets the original dict to the limited dict
d_breakfast = limiter(d_breakfast)
d_burgers = limiter(d_burgers)
d_chicken = limiter(d_chicken)
d_salad = limiter(d_salad)

Traceback (most recent call last):
  File "/Users/********/Desktop/*****/setup.command", line 68, in     <module>
    d_breakfast = limiter(d_breakfast)
  File "/Users/*******/Desktop/*****/setup.command", line 54, in  limiter
    if float(v) >= b_limit + 100:
ValueError: could not convert string to float: 
logout

Я думаю, что нашел несколько лучших решений для некоторых строк, чтобы хотя бы сократить то, что могло бы предотвратить преобразование. И теперь он совершенно точно не будет преобразован в точке, которая, как кажется, должна:

def dictionizer(str1, str2): 
    str1 = str1.strip().split('\n') 
    str2 = str2.replace('\n', ',').split(',') 
    str2 = list(filter(None, str2)) 
    str2 = [float(i) for i in str2] d = dict(zip(str1, str2)) 
    return d 

Все еще получаю: str2 = [float (i) для i в str2] ValueError: не удалось преобразовать строку в число с плавающей точкой:

Почему он не может преобразовать все в str2 в число с плавающей точкой? Попробуй целые числа, получи: str2 = [int (i) для i в str2] ValueError: недопустимый литерал для int () с основанием 10: ''

1 Ответ

0 голосов
/ 04 июня 2019

Попробуйте напечатать v внутри функции: ограничитель, непосредственно перед условием if.Конвертировать в .exe файл с включенной консолью.Проверьте значения v.

В сообщении об ошибке указывается, что значение v является строкой и не может быть преобразовано во флаг.

Некоторые значения из ваших словарей несовместимы.

...