Параметры командной строки Python - PullRequest
25 голосов
/ 27 января 2012

Я только начинаю с 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

Ответы [ 5 ]

61 голосов
/ 27 января 2012

Эта строка

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])
29 голосов
/ 27 января 2012

Гораздо лучший способ сделать это - библиотека argparse . Библиотека envoy wrapper упрощает работу с подпроцессом .

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

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))

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

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

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

8 голосов
/ 27 января 2012

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

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

3 голосов
/ 27 января 2012

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

import sys, string, os
print sys.argv

res = os.system(sys.argv[1]) sys.argv[2]
print res
1 голос
/ 27 января 2012

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

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

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