AvyWam
AvyWam

Reputation: 970

While loop asking two times for input() entry in python script

I use Python 3.7.1 (default, Dec 14 2018, 19:28:38).

First of all my script is running correctly the second time I enter a correct entry in input(), but I prefer it asks only once. In my code I wrote print() lines in order to see what is happening in real time and that's where I don't get what happens in the execution.

Let's see the script:

import subprocess
from scrapy import cmdline
import sys

champ_choix = ""
while champ_choix != "1" and champ_choix != "2":
    champ_choix=input("Pour cat_course tapez 1\nPour hippodrome tapez 2\n")
    print("L'input est : {}".format(champ_choix)) #the input is:
    print("le type de l'input est: {}".format(type(champ_choix))) #the type of input is:
    if champ_choix == "1": #Traite le champ hippodrome
        print("on a le champ_choix 1") #we have got choice 1
        #do instructions
        sys.exit() #to stop the script and stop asking once again an entry after it is done
    if champ_choix == "2":
        print("le champ_choix est 2") #we have got choice 2
        cmdline.execute(['scrapy','crawl','test_shell','-a','nom_prix=True'])
        sys.exit()

Now what I have in the terminal is:

Pour cat_course tapez 1
Pour hippodrome tapez 2
2 # here a good entry
L'input est : 2 # it says it is a good entry
le type de l'input est: <class 'str'> # it even says that's the good type
le champ_choix est 2 # it even says it is in the second `if` condition
Pour cat_course tapez 1 # but it asks once again, without executing instructions
Pour hippodrome tapez 2
2 # a good entry once more
L'input est : 2
le type de l'input est: <class 'str'>
le champ_choix est 2 # in the second `if` condition and now gonna finally execute instructions
#Running the spider as expected, that is alright
#Stop and exit, it is alright too

What is wrong?

Upvotes: 0

Views: 56

Answers (1)

Well worded question (props for giving the stdout) but make sure you are doing proper spacing (i.e. there should be a space before and after operators such as a == b).

1) Don't use sys.exit() just use break.

2) You need to prime your loop. In other words do one input before you
enter the loop then keep inputting at the END of your loop:

import subprocess
from scrapy import cmdline
import sys

while True: 
    champ_choix = input("Pour cat_course tapez 1\nPour hippodrome tapez 2\n")

    # This first if isn't needed because the if at the bottom catches this case
    # if champ_choix == "1": #Traite le champ hippodrome
    #     break
    if champ_choix == "2":
        cmdline.execute(['scrapy','crawl','test_shell','-a','nom_prix=True'])
    if champ_choix in ["1", "2"]:
        break

Upvotes: 1

Related Questions