Параметры командной строки 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
Ответы
Ответ 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])