2013-02-15 5 views
3

Мне нужно выполнить следующую команду через python. rtl2gds является инструментом, который читает в 2-х параметров: Путь к файлу и имя модуляПередача аргументов в os.system

rtl2gds -rtl=/home/users/name/file.v -rtl_top=module_name -syn 

Я читаю на пути к имени файла и модуля от пользователя через argparse, как показано ниже:

parser = argparse.ArgumentParser(description='Read in a file..')  
parser.add_argument('fileread', type=argparse.FileType('r'), help='Enter the file path')  
parser.add_argument('-e', help='Enter the module name', dest='module_name')  
args = parser.parse_args()  
os.system("rtl2gds -rtl=args.fileread -rtl_top=args.module_name -syn") 

Но путь к файлу, который считывается в args.fileread, не попадает в os.system, когда я вызываю -rtl = args.fileread. Вместо этого, args.fileread сам принимается за имя файла, а инструмент выдает ошибку.

Я уверен, что есть способ прочитать аргументы командной строки в os.system или какой-либо другой функции (может быть подпроцессом? - но не мог понять, как это сделать). Любая помощь приветствуется.

+0

Возможный дубликат [Вызов внешней команды в Python] (http://stackoverflow.com/questions/89228/calling-an-external-command-in-python) – Wolf

ответ

8

Не использовать os.system(); subprocess - это, безусловно, путь.

Ваша проблема заключается в том, что вы ожидаете, что Python поймет, что вы хотите интерполировать args.fileread в строку. Так же хорошо, как Python, он не способен читать ваш ум так!

Использование строки форматирования вместо:

os.system("rtl2gds -rtl={args.fileread} -rtl_top={args.module_name} -syn".format(args=args) 

Если вы хотите передать имя файла в другую команду, вы должны не использовать опцию FileType типа! Вы хотите, чтобы имя файла, не открытый объектный файл:

parser.add_argument('fileread', help='Enter the file path') 

Но использовать subprocess.call() вместо os.system():

import subprocess 

subprocess.call(['rtl2gds', '-rtl=' + args.fileread, '-rtl_top=' + args.module_name, '-syn']) 

Если rtl2gds реализует командную строку разборе правильно, = не является обязательным, и вы можете вместо этого используйте следующий вызов: избегайте конкатенации строк:

subprocess.call(['rtl2gds', '-rtl', args.fileread, '-rtl_top', args.module_name, '-syn']) 
+0

Это должно быть 'subprocess.call ([... , '-syn'' **] ** ')', иначе это 'SyntaxError'. – Bakuriu

+1

@Bakuriu: Спасибо; толстый палец опечатка. –

+0

Спасибо за ответы. rtl2gds нуждается в "rtl =". Он не работает только с «rtl». Когда я пытаюсь использовать опцию subprocess: subprocess.call (['rtl2gds', '-rtl =' + args.fileread, '-rtl_top =' + args.module_name, '-syn']) Я получаю следующее error: TypeError: не может конкатенировать объекты 'str' и 'file' – Nanditha

 Смежные вопросы

  • Нет связанных вопросов^_^