Подтвердить что ты не робот

Параметры командной строки Python

Я только начинаю с python, поэтому я борюсь с довольно простым примером. В основном я хочу передать имя исполняемого файла плюс его ввод с помощью аргументов командной строки, например:

python myprogram refprogram.exe refinput.txt

Это означает, что при выполнении myprogram он выполняет refprogram.exe и переходит к нему как к аргументу refinput. Я попытался сделать это следующим образом:

import sys, string, os
print sys.argv

res = os.system(sys.argv(1)) sys.argv(2)
print res

Сообщение об ошибке, которое я получаю:

res = os.system(sys.argv(1)) sys.argv(2)
                           ^
SyntaxError: invalid syntax

Кто-нибудь знает, что я делаю неправильно?

Я запускаю Python 2.7

4b9b3361

Ответ 1

Эта строка

res = os.system(sys.argv(1)) sys.argv(2)

Неправильно несколькими способами.

Во-первых, sys.argv - это список, поэтому вы используете квадратные скобки для доступа к его содержимому:

sys.argv[1]
sys.argv[2]

Во-вторых, вы скоро скопируете скобки на os.system, а sys.argv(2) останется висящим от конца. Вы хотите переместить закрывающую скобку до самого конца строки, после всех аргументов.

В-третьих, вам нужно отделить аргументы запятыми, простое пространство не будет делать.

Ваша последняя строка должна выглядеть так:

res = os.system(sys.argv[1], sys.argv[2])

Ответ 2

Далеко, гораздо лучший способ сделать это с помощью библиотеки argparse. В библиотеке enwoy wrapper subprocess легче работать с также.

Простой пример:

import argparse
import envoy

def main(**kwargs):
    for key, value in kwargs.iteritems():
        print key, value
    cmd = '{0} {1}'.format(kwargs['program'], ' '.join(kwargs['infiles']))
    r = envoy.run(cmd)
    print r.std_out
    print r.std_err

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Get a program and run it with input', version='%(prog)s 1.0')
    parser.add_argument('program', type=str, help='Program name')
    parser.add_argument('infiles', nargs='+', type=str, help='Input text files')
    parser.add_argument('--out', type=str, default='temp.txt', help='name of output file')
    args = parser.parse_args()
    main(**vars(args))

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

Основной метод печатает ключевые слова и значения. Затем он создает командную строку и передает ее посланнику для запуска. Наконец, он выводит результат из команды.

Если у вас установлен протокол, посланник может быть установлен с помощью pip install envoy. Самый простой способ получить pip - это pip-installer.

Ответ 3

sys.argv - это список и индексируется с использованием квадратных скобок, например. sys.argv[1]. Вы можете проверить len(sys.argv), прежде чем индексировать его.

Кроме того, если вы хотите передать параметры в os.system(), вам может понадобиться что-то вроде os.system(' '.join(sys.argv[1:])), но это не будет работать для аргументов с пробелами. Вам лучше использовать модуль подпроцесса.

Ответ 4

sys.argv - это список

import sys, string, os
print sys.argv

res = os.system(sys.argv[1]) sys.argv[2]
print res

Ответ 5

Если вы используете Python 2.7, рекомендуется использовать новый модуль subprocess.

В этом случае вы напишете

import sys, subprocess
result = subprocess.check_output(sys.argv[1], sys.argv[2])