Есть ли способ передать аргументы командной строки (аргументы) при запуске сценария Python в IDLE? - PullRequest
40 голосов
/ 27 января 2010

Я тестирую некоторый код Python, который анализирует ввод командной строки. Есть ли способ передать этот вход через IDLE? В настоящее время я сохраняю в редакторе IDLE и запускаю из командной строки.

Я использую Windows.

Ответы [ 11 ]

32 голосов
/ 27 января 2010

Не похоже, что IDLE предоставляет способ сделать это через графический интерфейс, но вы можете сделать что-то вроде:

idle.py -r scriptname.py arg1 arg2 arg3

Вы также можете установить sys.argv вручную, например:

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

(Кредит http://wayneandlayne.com/2009/04/14/using-command-line-arguments-in-python-in-idle/)

10 голосов
/ 16 июня 2014

В крайнем случае, Сет № 2 сработал ....

2) Вы можете добавить тестовую строку перед вызовом основной функции, которая предоставляет массив аргументов (или создать модульный тест, который делает то же самое) или установите sys.argv напрямую.

Например ...

sys.argv = ["wordcount.py", "--count", "small.txt"]
5 голосов
/ 27 января 2010

Вот несколько способов, которые я могу придумать:

1) При желании вы можете вызывать свою "основную" функцию непосредственно на консоли IDLE с аргументами.

2) Вы можете добавить тестовую строку перед вызовом основной функции, которая предоставляет массив аргументов (или создать модульный тест, который делает то же самое), или напрямую установить sys.argv.

3) Вы можете запустить python в интерактивном режиме на консоли и передать аргументы:

C:\> python.exe -i some.py arg1 arg2
4 голосов
/ 22 июня 2017

Недавний патч для Выпуск 5680 должен наконец начать использовать эту функцию в будущих выпусках IDLE. Тем временем, , если вы хотите, чтобы ваш скрипт автоматически определял IDLE и запрашивал значения аргументов командной строки , вы можете вставить (что-то вроде этого) в начало вашего кода:

#! /usr/bin/env python3

import sys

def ok(x=None):
      sys.argv.extend(e.get().split())
      root.destroy()


if 'idlelib.rpc' in sys.modules:

      import tkinter as tk

      root = tk.Tk()
      tk.Label(root, text="Command-line Arguments:").pack()

      e = tk.Entry(root)
      e.pack(padx=5)

      tk.Button(root, text="OK", command=ok,
                default=tk.ACTIVE).pack(pady=5)

      root.bind("<Return>", ok)
      root.bind("<Escape>", lambda x: root.destroy())

      e.focus()
      root.wait_window()

Вы следовали бы этому со своим обычным кодом. то есть. print(sys.argv)

Если используется в python 2.6 / 2.7, тогда обязательно пишите с заглавной буквы: import Tkinter as tk

В этом примере я попытался найти удачный баланс между особенностями и краткостью. Не стесняйтесь добавлять или убирать функции по мере необходимости!

enter image description here

Обновление: 2018-03-31:

запрос на получение все еще открыт: (

2 голосов
/ 25 июня 2017

Автоопределение IDLE и запрос аргументов командной строки

#! /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())


Измените "input" на "raw_input" для Python2.

1 голос
/ 12 июня 2016

Исходя из сообщения Данбена, вот мое решение, которое работает в режиме IDLE:

try:  
    sys.argv = ['fibo3_5.py', '30']  
    fibonacci(int(sys.argv[1]))  
except:  
    print(str('Then try some other way.'))  
1 голос
/ 10 октября 2015

Visual Studio 2015 имеет дополнение для Python. Вы можете предоставить аргументы с этим. VS 2015 теперь бесплатно.

1 голос
/ 20 февраля 2013

Этот код прекрасно работает для меня, я могу использовать «F5» в режиме ожидания и затем снова вызвать из интерактивного приглашения:

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

...

if __name__ == "__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")
0 голосов
/ 28 января 2019

Существует столько же способов сделать это, как и пользователям. Я, будучи новичком, я только что проверил на аргументы (сколько). Когда режим ожидания запускается из проводника Windows, он имеет только один аргумент (то есть len (sys.argv) возвращает 1), если вы не запустили IDLE с параметрами. IDLE - это просто файл bat в Windows ... который указывает на idle.py; в Linux я не использую простоя.

То, что я склонен делать, это при запуске ...

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

Я понимаю, что использует кувалду, но если вы просто поднимаете IDLE, щелкая его в установке по умолчанию, он будет работать. Большая часть того, что я делаю, - это называю питона с другого языка, поэтому единственный раз, когда это имеет значение, это когда я тестирую.

Для такого нуба, как я, легко понять.

0 голосов
/ 04 января 2019

import sys

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

// Если вы передаете командную строку для 'help' или 'verbose', вы можете сказать как:

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

...