web-dev-qa-db-fra.com

Lorsque vous exécutez un script python dans IDLE, existe-t-il un moyen de passer des arguments de ligne de commande (args)?

Je teste du code python qui analyse les entrées en ligne de commande. Existe-t-il un moyen de transmettre cette entrée via IDLE? Actuellement, je sauvegarde dans l'éditeur IDLE et je lance à partir d'une invite de commande.

J'utilise Windows.

38
Ben Gartner

Il ne semble pas que IDLE offre un moyen de le faire via l'interface graphique, mais vous pouvez faire quelque chose comme:

idle.py -r scriptname.py arg1 arg2 arg3

Vous pouvez également définir sys.argv manuellement, comme suit:

try:
    __file__
except:
    sys.argv = [sys.argv[0], 'argument1', 'argument2', 'argument2']

(Crédit http://wayneandlayne.com/2009/04/14/using-command-line-arguments-in-python-in-idle/ )

32
danben

À la limite, le numéro 2 de Seth a fonctionné ....

2) Vous pouvez ajouter une ligne de test devant votre appel de fonction principale qui fournit un tableau d'arguments (ou crée un test unitaire qui fait la même chose.).

Par exemple... 

sys.argv = ["wordcount.py", "--count", "small.txt"]
10
ackmondual

Voici quelques façons auxquelles je peux penser: 

1) Vous pouvez appeler votre fonction "principale" directement sur la console IDLE avec des arguments si vous le souhaitez. 

2) Vous pouvez ajouter une ligne de test devant votre appel de fonction principale fournissant un tableau d'arguments (ou créer un test unitaire faisant la même chose) ou définir directement sys.argv. 

3) Vous pouvez exécuter python en mode interactif sur la console et passer des arguments: 

C:\> python.exe -i some.py arg1 arg2
5
Seth

Détecter automatiquement IDLE et demander des arguments en ligne de commande

#! /usr/bin/env python3

import sys

# Prompt user for (optional) command line arguments, when run from IDLE:
if sys.modules['idlelib']: sys.argv.extend(input("Args: ").split())


Remplacez "input" par "raw_input" pour Python2.

2
veganaiZe

Ce code fonctionne très bien pour moi. Je peux utiliser "F5" dans IDLE, puis rappeler à partir de l'invite interactive:

def mainf(*m_args):
    # Overrides argv when testing (interactive or below)
    if m_args:
        sys.argv = ["testing mainf"] + list(m_args)

...

if __== "__main__":
    if False: # not testing?
        sys.exit(mainf())
    else:
        # Test/sample invocations (can test multiple in one run)
        mainf("--foo=bar1", "--option2=val2")
        mainf("--foo=bar2")
1
MarcH

Basé sur le post de danben, voici ma solution qui fonctionne dans IDLE:

try:  
    sys.argv = ['fibo3_5.py', '30']  
    fibonacci(int(sys.argv[1]))  
except:  
    print(str('Then try some other way.'))  
1
user164969

Visual Studio 2015 a un addon pour Python. Vous pouvez fournir des arguments avec cela. VS 2015 est maintenant gratuit.

1
eddyq

Il semble y avoir autant de façons de le faire que d’utilisateurs. Étant moi-même un noob, je viens de tester des arguments (combien). Lorsque l'inactif démarre à partir de l'Explorateur Windows, il n'a qu'un seul argument (... c'est-à-dire que len (sys.argv) renvoie 1), sauf si vous avez démarré l'IDLE avec des paramètres. IDLE est juste un fichier bat sous Windows ... qui pointe vers idle.py; sur linux, je n'utilise pas d'inactivité.

Ce que j'ai tendance à faire, c'est au démarrage ...

if len(sys.argv) == 1
    sys.argv = [sys.argv[0], arg1, arg2, arg3....] <---- default arguments here

Je me rends bien compte qu’il s’agit d’un marteau, mais si vous n’affichez que l’IDLE en cliquant dessus lors de l’installation par défaut, cela fonctionnera. La plupart de ce que je fais est d'appeler le python depuis un autre langage. Le seul cas où cela fait une différence, c'est quand je teste.

Il est facile pour un noob comme moi de comprendre.

0
Brian Withnell

La réponse de veganaiZe produit une KeyError en dehors de IDLE avec python 3.6.3. Ceci peut être résolu en remplaçant if sys.modules['idlelib']: par if 'idlelib' in sys.modules: comme ci-dessous.

import argparse
# Check if we are using IDLE
if 'idlelib' in sys.modules:
    # IDLE is present ==> we are in test mode
    print("""====== TEST MODE =======""")
    args = parser.parse_args([list of args])
else:
    # It's command line, this is production mode.
    args = parser.parse_args()
0
plep

système d'importation

sys.argv = [sys.argv [0], '-arg1', 'val1', '-arg2', 'val2']

// Si vous passez en ligne de commande pour 'help' ou 'verbose', vous pouvez dire en tant que:

sys.argv = [sys.argv [0], '-h']

0
Archie Yalakki