2013-02-15 3 views
3

파이썬을 통해 다음 명령을 실행해야합니다. 아래os.system에 인수 전달하기

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

내가 argparse를 통해 사용자의 파일 및 모듈 이름의 경로에 읽고있다을 같이 경로 파일 및 모듈 이름 : rtl2gds는이 개 매개 변수를 읽는 도구입니다

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로 읽어 들인 파일 경로는 -rtl = args.fileread를 호출 할 때 os.system에 들어 가지 않습니다. 대신 args.fileread 자체가 파일 이름으로 간주되고 도구는 오류를 표시합니다.

os.system 또는 다른 기능 (명령 줄 인수가 하위 프로세스 일 수 있음)으로 명령 줄 인수를 읽는 방법이있을 것이라고 확신합니다. 어떤 도움을 주셔서 감사합니다.

+0

[Python에서 외부 명령 호출] 가능한 복제본 (http://stackoverflow.com/questions/89228/calling-an-external-command-in-python) – Wolf

답변

8

os.system()을 사용하지 마십시오. subprocess은 확실히가는 길입니다.

그러나 문제는 파이썬이 args.fileread을 문자열로 삽입하려고한다는 것을 이해할 것으로 기대한다는 것입니다. 파이썬만큼 위대해서, 그런 식으로 마음을 읽을 수는 없습니다! 대신

를 사용하여 문자열 서식 : 다른 명령에 파일 이름을 전달하려는 경우

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

그러나 os.system() 대신 subprocess.call()를 사용합니까 : 당신은 열려있는 파일 객체가되지파일 이름, 원하는 rtl2gds 제대로 구문 분석 명령 줄을 구현

import subprocess 

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

경우을의 =는 선택 사항이며 당신은 할 수 대신에 다음과 같은 호출을 사용하여 문자열 연결을 모두 피하십시오.

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.call ([ 'rtl2gds', '-rtl ='+ args.fileread, -rtl_top = '+ args.module_name,'-syn ']) 다음과 같은 메시지가 표시됩니다 오류 : TypeError : 'str'및 'file'개체를 연결할 수 없습니다. – Nanditha