2014-06-30 3 views
1

По какой-то причине мой скрипт отказывается запускать непосредственно из Text Wrangler, но отлично работает при импорте в терминал.Python: скрипт работает только при импорте в терминал. MAC

import math 

def main(): 
    print("This program find the real solutions to a quadratic\n") 
    a,b,c, = eval(input("Please enter the coefficients (a,b,c): ")) 
    discRoot = math.sqrt(b * b -4 * a * c) 
    root1 = (-b + discRoot)/(2 * a) 
    root2 = (-b - discRoot)/(2 * a) 
    print("\nThe solutions are:" , root1, root2) 


main() 

Когда я бегу, что в TextWrangler, я получаю сообщение об ошибке «TypeError: Eval() аргумент 1 должен быть строкой или объектный код». Не следует ли использовать eval(), чтобы следующий ввод был целым числом, а не строкой? Почему это происходит?

+0

Почему вы используете eval? –

+0

Я только начинаю изучать питон, поэтому я следую инструкциям книги. – user3580073

+1

вы должны установить ipython для python 2.7 и 3.4. Есть много интересных расширений, которые вы можете использовать. –

ответ

4

В Python 2, input() эквивалентно eval(input()) в Python 3. Я думаю, что в терминале вы работаете его с Python 3, но TextWrangler использует Python 2 Поэтому TextWrangle делает eval(eval(input())) - которое приводится к eval(5), что вызывает вы видите.

Чтобы исправить это, вам необходимо обновить TextWrangler или использовать Python 2 в терминале. Если вы хотите второй вариант, вы должны заменить eval(input()) на input().

Сторона примечания - используя eval, как будто это плохая идея (это опасно). Вероятно, вы должны сделать что-то вроде a, b, c = map(int, input().split(",")) (в Python 3).

+0

Да, я использую 3.4.1 в терминале. Должен ли я добавить строку Shebang в свой скрипт, чтобы исправить это, или есть способ сделать TextWrangler запущенным с Python 3.4? – user3580073

+0

Я бы предположил, что есть способ заставить TextWrangler работать с Python 3.4 (большинство достойных текстовых редакторов должны быть в состоянии), но я не знаю, что это такое. – rlms

+0

Функция карты отлично поработала, спасибо вам большое. Вы говорили, что eval опасен, если мой вход является кортежем? Это нормально, если это всего лишь одно значение? – user3580073

0

Проблема не с eval. Проблема заключается в input, который пытается читать стандартный входной поток от sys.stdin.

Если вы хотите обойти это, вы должны передать аргумент eval в качестве аргумента вместо использования input.